常用 g++/gcc 选项
编译选项
-
-c
: 只编译源文件,不进行链接,生成目标文件。 -
-o <file>
: 指定输出文件的名称。 -
-g
: 生成调试信息,允许使用调试器进行调试。 -
-O<level>
: (大写的字母O)指定优化级别,https://blog.csdn.net/weixin_46135347/article/details/122172470-
指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
-Ox这个参数只有在CMake -DCMAKE_BUILD_TYPE=release时有效,因为debug版的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版的不需要调试信息但需要优化。
说明:
1)在编译时,如果没有指定上面的任何优化参数,则默认为 -O0,即没有优化。2)参数 -O1、-O2、-O3 中,随着数字变大,代码的优化程度也越高,不过这在某种意义上来说,也是以牺牲程序的可调试性为代价的。
3)参数 -Og 是在 -O1 的基础上,去掉了那些影响调试的优化,所以如果最终是为了调试程序,可以使用这个参数。不过光有这个参数也是不行的,这个参数只是告诉编译器,编译后的代码不要影响调试,但调试信息的生成还是靠 -g 参数的。
4)参数 -Os 是在 -O2 的基础上,去掉了那些会导致最终可执行程序增大的优化,如果想要更小的可执行程序,可选择这个参数。
5)参数 -Ofast 是在 -O3 的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。
-
-
-Wall
: 启用常见警告信息。 -
-std=<standard>
: 指定C++标准(如-std=c++11
)。 -
-I<dir>
: 添加包含文件搜索路径。 -
-L<dir>
: 添加库文件搜索路径。 -
-l<library>
: 链接指定的库。 -
-m<32/64/x32/486>
:编译器中的架构选项,用于指定目标系统的位数,通常使用-m64
-
-fPIC
是g++编译器的一个选项,用于生成位置无关代码(Position Independent Code,PIC)。位置无关代码是一种可在内存中加载并运行的代码,而不受加载地址的限制。这通常在创建共享库或动态链接库(.so文件或.dll文件)时使用。 -
-fvisibility=hidden
:选项的作用是将编译单元(通常是一个源文件或一个库)中的符号默认设为“隐藏”。这意味着只有在同一编译单元内的其他部分可以访问这些符号,而在不同编译单元之间无法访问。这对于实现信息封装、减少符号污染以及提高代码的安全性非常有用。使用这个选项通常需要与其他一些编译器指令一起使用,以明确指定哪些符号应该是可见的(例如,使用__attribute__((visibility("default")))
)。主要用于UNIX/Linux平台上的共享库或动态链接库的开发。
链接选项
-shared
: 生成共享库。-static
: 静态链接所有库。-Wl,<option>
: 将<option>
传递给链接器。
预处理宏选项
-D <macro>
: 定义预处理宏。-U <macro>
: 取消预处理宏的定义。
依赖关系选项
-M
和-MM
: 自动生成Makefile所需的依赖关系信息。
其他选项
-E
: 只执行预处理,生成预处理后的源代码。-S
:生成汇编.s
文件
参考
g++ 编译选项:https://blog.csdn.net/qq_44632658/article/details/131152115
C++ 返回值优化(RVO):https://blog.csdn.net/Snow__Sunny/article/details/127373650