编译选项

(3 mins to read)
  • -Wall -Wextra
  • -Wshadow
  • -Wundef
  • -Wconversion
  • -fno-common:避免全局变量
  • -Wfloat-equal
  • -Wunreachable-code
  • -Wformat=2:检查printfscanf的格式控制符
  • -fmudflap:在运行时检查指针操作以捕获未定义行为
  • -fno-exceptions:在代码中使用异常时,报错
  • -ffast-math;要求高性能,但不要求精度
  • -fomit-frame-pointer:省略栈帧
  • -fno-plt
  • -ipo:开启过程间优化
  • -no-pie:关闭位置无关
  • -fPIE:positionindependent executable,生成位置无关可执行文件
  • -fPIC:position independent code,生成位置无关代码,用于生成共享库
  • -rpath:指定运行时共享库的搜索路径
  • -Wl:让编译器将后面逗号分隔的参数传给链接器(-Wl,-rpath
  • -m32:编译32位程序
  • -pedantic:对非C++标准的扩展发出警告
  • -fanalyzer:启用静态分析,以报告更多问题(有更高的overhead)
  • -fstack-protector:检查缓冲区溢出
  • -flto:开启链接时优化,通常编译器只会在单个翻译单元内进行优化,这样可以在整个程序上优化
  • -rdynamic:指示链接器将所有符号(不仅是已经使用的)都添加到动态符号表中
  • -march=native -mtune=native:根据CPU进行特定优化
  • -ftree-vectorize:将循环转化为向量化指令
  • -floop-nest-optimize:优化嵌套循环
  • -I -L:指定链接时查找的include文件夹和共享库文件夹,环境变量$LD_LIBRARY_PATH为运行时查找的共享库文件夹
  • -save-temps:保留所有编译的中间文件(.c, .i, .s, .o
  • -v:输出详细信息
  • -E:只进行编译预处理
  • -S:生成汇编(一般产生的汇编以.s为后缀,而自己写的以.S为后缀,也是为了避免被覆盖)
  • -l:链接
  • -Os:优化文件大小,-Oz更激进
  • -g:添加debug信息(dwarf)默认选项,同-g2
  • -g0:不生成任何调试信息,和编译时不加-g是一样的。
  • -g1:生成最少量的调试信息,这些信息足够用来通过backtrace查看调用栈符号信息。主要包括了函数声明、外部变量和行号等信息,但是不包含局部变量信息。这个选项比较少用。
  • -g2:生成足够多的调试信息,可以用GDB进行正常的程序调试,这个是默认选项。
  • -g3:在-g2的基础上产生更多的信息,如宏定义。
  • -Og:一定程度的优化,但保证debug体验
  • -s:移除符号表和重定位信息