GCC常用编译选项
gcc编译选项
版本信息
-v 输出gcc版本
调试
-g 产生调试信息
-ggdb 产生供gdb使用的调试信息
-fsanitize=address
-fsanitize=pointer-compare
警告/错误
-Wall 输出所有警告
-Wextra
-pddantic
-Werror 将警告视为错误
-w 禁止所有警告
-Wsign-conversion
-Wshadow
-Wno-unused-variable
-Wno-unused-function
编译过程相关
-E 输出预处理之后的内容
-S 输出编译后的汇编代码
-c 输出目标代码
-C 一般与-E一起使用 使得预处理后注释仍然保留
# 预处理
gcc -E hello.c -o hello.i
# 编译
gcc -S hello.i -o hello.s
# 汇编
gcc -c hello.s -o hello.o
# 链接
gcc hello.o -o hello
-I 添加头文件搜索路径
-L 添加库文件搜索路径
-l 指定链接的库名 如-lm代表链接libm.so或libm.a 由于链接算法 该选项必须在引用该库的文件之后出现 库与库直接也是如此 一般加在最后
-o 指定输出文件名
-x 指定编译文件的语言 而不是通过后缀自动识别 -x后面所有文件均被认为是指定的类型的文件 除非使用-x none回退回默认
优化相关
-O0 不优化
-O1 一级优化 默认
-O2 二级优化
-O3 三级优化
-Os 优化生成代码大小
标准相关
-ansi 使编译器遵循ANSI C标准
-std= [c89,c99,c11,c17,c18,c23,c2x] 使编译器遵循C89标准
-std=gnu99 使编译器遵循GNU 99的语法
-std=gnu11 使编译器遵循GNU 11的语法
路径相关
-I 使gcc查找指定的头文件路径
-L 使gcc查找指定的库路径
宏相关
-D 预处理时添加宏 如-DDEBUG[=bar] 则相当于在每个文件中都宏定义了 #define DEBUG [bar] 或者-DNUM=0 则指定宏定义的内容
-U 取消宏
生成代码位数
-m32 生成代码为32位
-m64 生成代码为64位
库相关
-static 强制使用静态库
-shared 生成动态库
-fPIC 生成位置无关代码 一般在生成动态库前使用
-Wl,-rpath= 指定程序运行时使用动态库的路径
-fPIE