编译选项
GCC 13.3 命令汇总
路径选项
  
    
      | 选项 | 解释 | 
  
  
    
      | -I<dir> | 指定额外的头文件搜索路径 | 
    
      | -L<dir> | 指定额外的库文件搜索路径 | 
  
优化选项
  
    
      | 选项 | 解释 | 
  
  
    
      | -O0 | 不进行优化处理,默认设置 | 
    
      | -O或-O1 | 编译器会尝试减少代码大小和执行时间,而不执行任何需要大量编译时间的优化 | 
    
      | -O2(常用) | 执行 -O1所有优化选项,同时额外执行几乎全部不需要在空间和性能之间平衡的优化选项。会尝试更多的寄存器级的优化以及指令级的优化
 | 
    
      | -O3 | 开启更激进的优化。但并不保证优化在任何情况下等效。 | 
    
      | -Os | 优化程序的大小,减少生成的代码体积。 执行
 -O2所有优化选项,排除那些可能导致程序大小增加的优化选项。 | 
    
      | -Ofast | 启用所有 -O3的优化,并且开启一些可能会导致不符合标准的优化。 | 
    
      | -Og | 优化级别适中,旨在提高程序性能的同时,保留调试信息。 | 
    
      | -Oz | 与 -Os类似,但更注重最大限度地减小生成的代码大小。 | 
  
正规的商业软件开发当中一般不会使用-O3,而是使用-O2加上一小部分经过验证的-f选项。
语言选项
  
    
      | 选项 | 解释 | 
  
  
    
      | -std=<standard> | C 标准: c99、c11C++标准:
 c++11、c++14、c++17 | 
    
      | -fno-exceptions | 禁用 C++ 异常支持 | 
  
警告选项
  
    
      | 选项 | 解释 | 
  
  
    
      | -Werror | 将所有警告当作错误处理 | 
    
      | -Wall | 启用大部分警告信息 | 
    
      | -Wextra | 启用更多额外的警告信息 | 
    
      | -w | 不生成任何警告信息 | 
  
调试选项
  
    
      | 选项 | 解释 | 
  
  
    
      | -g | 生成调试信息 | 
    
      | -g<level> | 调试信息生成级别,可选值为 0, 1, 2, 3,默认为 2 | 
    
      | -ggdb | 将尽可能的生成 gdb 的可以使用的调试信息 | 
    
      | -p | 生成性能分析信息,通常与 prof工具结合使用 | 
    
      | -pg | 生成性能分析信息,通常与 gprof工具结合使用 | 
  
生成选项
其他选项
  
    
      | 选项 | 解释 | 
  
  
    
      | -Wa,<option> | 将逗号分隔的 <option>传递给汇编器。 | 
    
      | -Wp,<option> | 将逗号分隔的 <option>传递到预处理器。 | 
    
      | -Wl,<option> | 将逗号分隔的 <option>传递给链接器。 | 
    
      | -v | 显示详细的编译、汇编、连接命令 | 
  
链接选项
GCC 13.3 链接选项
使用ld --hlep查看全部链接选项
  
    
      | 选项 | 解释 | 
  
  
    
      | -l<lib> | 链接时添加依赖库 | 
    
      | -static | 禁止使用动态库 | 
    
      | -shared | 尽量使用动态库(默认选项) | 
    
      | -fPIE | Create a position independent executable | 
    
      | -s | Strip all symbols | 
    
      | -S | Strip debugging symbols | 
    
      | -rpath <path/to/lib> | Set runtime shared library search path | 
  
rpath
# 使用绝对路径
-Wl,-rpath,<path/to/lib>
# $ORIGIN是一个ELF替代序列,表示被载入的可执行程序在文件系统中所处的位置
# 为了不被shell解释器误认为是一个变量,可能需要使用单引号将$ORIGIN扩起来
-Wl,-rpath,$ORIGIN../lib
常用编译优化选项
在-O2的基础上一般选择性使用以下编译优化选项:
  
    
      | 选项 | 解释 | 
  
  
    
      | -march | 只为特定类型的 CPU 生成代码 | 
    
      | -finline-functions | 内联简单的函数到被调用函数中 | 
    
      | -funswitch-loops | 将无变化的条件分支移出循环 | 
    
      | -ftree-vectorize | 循环向量化 | 
  
常用安全选项
  
    
      | 选项 | 阶段 | 解释 | 
  
  
    
      | -Wl,-z noexecstack | 链接 | 堆栈不可执行保护 | 
    
      | -Wl,-z now | 链接 | GOT 表保护 | 
    
      | -fstack-protector-strong 
 -fstack-protector-all | 编译 | 栈保护 | 
    
      | -fPIC | 编译 | 地址无关的代码 | 
    
      | -fPIE | 链接 | 地址无关可执行 | 
    
      | -fstack-check | 编译 | 栈检查 | 
    
      | -ftrapv | 编译 | 整数溢出检查(对性能影响比较大) |