常用 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

posted @ 2023-10-12 23:42  黄河大道东  阅读(75)  评论(0编辑  收藏  举报