编译选项

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 标准:c99c11
C++标准:c++11c++14c++17
-fno-exceptions 禁用 C++ 异常支持

警告选项

选项 解释
-Werror 将所有警告当作错误处理
-Wall 启用大部分警告信息
-Wextra 启用更多额外的警告信息
-w 不生成任何警告信息

调试选项

选项 解释
-g 生成调试信息
-g<level> 调试信息生成级别,可选值为 0, 1, 2, 3,默认为 2
-ggdb 将尽可能的生成 gdb 的可以使用的调试信息
-p 生成性能分析信息,通常与 prof 工具结合使用
-pg 生成性能分析信息,通常与 gprof 工具结合使用

生成选项

选项 解释
-fPIC 生成位置无关目标码

其他选项

选项 解释
-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 编译 整数溢出检查(对性能影响比较大)