编译选项
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 、c11 C++标准: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 |
编译 |
整数溢出检查(对性能影响比较大) |