常用 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 @     阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-10-12 ExpiringMap用法详解
点击右上角即可分享
微信分享提示