GCC 全称是 GNU C Compiler,是gnu中最流行的c & c++编译器,下面我们看一下一些主要的参数使用方法。
gcc test.c
默认生成a.out, -o指定生成的文件名
gcc test.c -o test
实质上,上述编译过程是分为四个阶段进行的,包括预处理(Preprocessing)、编译(Compilation)、汇编 (Assembly)和链接(Linking)。
1.编译过程
1.1预处理
gcc -E test.c -o test.i
-E指定gcc预处理结束就停下来,主要完成包含头文件、去除注释、替换宏等工作
1.2编译
gcc -S test.i -o test.s
-S将源文件编译成汇编代码
1.3汇编
gcc -c test.s -o test.o
gas汇编器负责将汇编代码编译为机器代码
1.4链接
gcc test.o –o test
2.调试
gcc -g test.c –o test
-g生产供gdb调试用的debug信息,生成的可执行文件大,执行效率低
strip可以删除其中的debug信息
strip test
3.优化编译
gcc -O test.c -o test
-O使编译器对代码进行自动优化编译,生产效率更高的可执行文件,另外
-O0 不优化
-O|-O1, 默认优化
-O2 -O3 更高级别优化
4.检错
gcc -Wall test.c –o test
-Wall,将所有的警告信息全开
5.库文件
编译动态库
gcc –shared –fPIC test.o –o libtest.so
-shared 表示生产动态链接库
-f后面跟一些编译选项,PIC表示生产位置无关代码(Position Independent Code),即可以在进程的任意内存位置执行的目标码
编译静态库
ar cr libtest.a test.o
-c表示创建一个新的库,-r表示插入文件号码到库中
链接库文件
gcc test.c -L/path/lib -lxxx -I/path/include
-I, 指定头文件所在的文件夹
-l, 指定所使用到的函数库。默认优先使用动态库libxxx.so,-static选项可以禁止使用动态库
-L,指定函数库所在的文件夹
动态库链接时搜索路径顺序:
1. 编译目标代码时-L指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH(动态库搜索路径)
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib、/usr/lib
静态库链接时搜索路径顺序:
1. 参数-L指定路径
2. 环境变量LIBRARY_PATH(指定程序静态链接库文件搜索路径)
3. 默认目录 /lib 、/usr/lib、 /usr/local/lib
6.宏
-Dmacro
相当于#define macro
-Dmacro=defn
相当于#define macro=defn
-Umacro
相当于#undef macro
7.头文件依赖
-M,生成文件关联的信息,包含目标文件所依赖的所有头文件
-MM,同上,但忽略由#include<file>造成的依赖关系
-MD,和-M相同,但是输出将导入到.d的文件里面
-MMD,和-MM相同,但是输出将导入到.d的文件里面