7.7.3. gcc编译选项总结
7.7.3.1. 介绍
gcc和g++分别是gnu的c以及c++编译器,gcc/g++在执行编译工作的时候,总共需要4步
预处理,生成.i的文件(由预处理器cpp完成)
将预处理后的文件转换成汇编文件,生成.s文件(由编译器egcs完成)
由汇编变为目标代码(机器代码)生成.o文件(由汇编器as完成)
连接目标代码,生成可执行程序(由链接器ld完成)
详细可参考gcc官方文档 https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
7.7.3.2. 常用编译选项
-c 只编译生成目标文件
-E 只运行C预编译器
-g 生成调试信息
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY
-LDIRECTORY 指定额外的函数库搜索路径
-lLIBRARY 连接时搜索指定的函数库LIBRARY
-o 生成指定的输出文件
-O0 不进行优化处理
-O 或 -O1 优化生成代码
-O2 进一步优化
-O3 比-O2更进一步优化,包括inline函数
-shared 生成共享目标文件,通常用在建立共享库时
-static 禁止使用共享连接
-w 不生成任何警告信息
-Wall 生成所有警告信息
7.7.3.2.1. 参数详解
-c
只激活预处理,编译和汇编,生成obj文件
gcc -c hello.c
只会生成hello.o文件
-S
只激活预处理和编译,生成汇编代码.s
gcc -S hello.c
生成hello.s文件
-E
只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
gcc -E hello.c > log
-o
指定目标文件名,缺省情况下gcc编译出来的文件是a.out
gcc -o hello hello.c
-include file
包含某个文件,功能类似于在文件中使用#include <filename>
gcc hello.c -include src/hello.h
-Dmacro
相当于C语言中的 #define macro
-Dmacro=defn
相当于C语言中的#define macro defn
-Umacro
相当于C语言中的#undef macro
-Idir
在你用#include “filename”的时候,gcc会首先在当前目录查找你指定的头文件,如果没有找到,则会去缺省的头文件路径找,如果使用-I指定了目录, 则会首先在指定的路径查找,如果找不到再去按顺序查找
-Ldir
指定编译的时候搜索库的路径
-static
禁止使用动态库,编译出来的东西比较大,但不要需要动态链接库就可以运行
-share
使用动态库,生成的文件比较小,一般由其他应用程序进行连接
-fPIC
产生位置无关的代码,当产生共享库的时候,应该创建位置无关的代码,这会让共享库使用任意的地址而不是固定的地址
gccc -shared -fPIC -o hello.so hello.c
-v
参数-v提供详细信息,打印gcc编译一个文件的时候的所有步骤
-Werror
使用这个参数可以将所有的警告信息转换为错误
-std
指定支持的c/c++标准
7.7.3.2.2. 常见问题
多个库文件被链接时顺序问题导致编译失败
解决办法: 增加以下编译选项
-Wl,--start-group
... ##库文件
-Wl,--end-group