Linux下编译C/C++以及gcc/g++常用参数

编译的步骤

gcc and g++分别是c & c++编译器 。gcc/g++在执行编译工作的时候,总共需要4步

1.预处理,生成.i的文件[预处理器cpp]。 对应的参数是 -E
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]。对应的参数是 -S
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]。对应的参数是 -c
4.连接目标代码,生成可执行程序[链接器ld]。无参数。

编译步骤举例

test.c代码如下:

#include<stdio.h>
#include<stdlib.h>

int main(int arg,char **cha){
 printf("参数个数%d\n",arg);
 printf("*****\n");
 printf("参数1:%s\n",cha[0]);

 printf("参数2:%s\n",cha[1]);
 return 0;
}

Linux下编译C/C++以及gcc/g++常用参数_第1张图片

一步到位的命令式 :gcc test.c -o test

常用参数

-E
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.
  例子用法:
  gcc -E hello.c > test.txt
  gcc -E hello.c | more
-S
  只激活预处理和编译,就是指把文件编译成为汇编代码。
  例子用法
  gcc -S hello.c
  他将生成.s的汇编代码,你可以用文本编辑器察看
-c
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
  例子用法:
  gcc -c hello.c
  他将生成.o的obj文件
-o
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感
,改掉它,哈哈
  例子用法
  gcc -o hello.exe hello.c (哦,windows用习惯了)
  gcc -o hello.asm -S hello.c
-l
  需要链接的库名称。即链接库文件去掉lib前缀和.so后的部分。如libev.so就是 -lev;libace.so就是 -lace。
-L
  链接库文件的搜索路径。
  默认链接库的搜索路径为/lib和/usr/lib。
  实际的搜索路径可以参见本博客的文章ldconfig , ldd 与 LD_LIBRARY_PATH 之间的关系
  若安装了新的开发包需要配置系统的链接配置。详见
-I
  include头文件的搜索路径。
  当有此选项时,优先搜索此路径下的头文件。然后按照#include后面是”“还是<>来决定是优先在当前目录搜索还是优先在系统目录搜索。
  默认头文件的路径为当前目录./ 和系统目录 /usr/include /usr/local/include。
-g
  增加调试信息。
-O0
-O1
-O2
-O3
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。
-imacros file
  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
  
-Dmacro
  相当于C语言中的#define macro
  
-Dmacro=defn
  相当于C语言中的#define macro=defn
  
-Umacro
  相当于C语言中的#undef macro
-undef
  取消对任何非标准宏的定义

-w
  不生成任何警告信息。
-Wall
  生成所有警告信息。

-static
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行.
-shared
  编译成动态链接库。通常用在建立共享库时。 需要配合参数-fPIC使用。
参考:http://my.oschina.net/u/1864567/blog/304351

你可能感兴趣的:(linux,gcc)