常见 GCC C++ 编译选项

作者: , 共 1241 字 , 共阅读 0

一个典型的 GCC C++编译过程为:

g++ hello.cpp -c -o hello.o -I /opt/include -isystem /usr/include 
g++ hello.o -o hello -L /opt/include -l folly -l boost_system 

这两步可以简化到一步:

g++ hello.cpp -o hello  -I /opt/include -isystem /usr/include -L /opt/include -l folly -l boost_system 

1. 路径和链接库

涉及如下参数:

  • -I#include包含头文件时,头文件的查找路径。将依次查找。
  • -isystem#include <header>包含头文件时,头文件的查找路径(优先级在-I之后)。而且将不显示这些头文件里出现的警告(反正也无法修改)。
  • -l:需要链接的库。
  • -L:链接库所在路径。
  • -Wl,rpath: 需要添加到程序RUNPATH的路径

如果用到多线程,需要添加选项-pthread

2. 宏和优化级别

-DMACRO或者-DMACRO=value可以指定宏。其中最终要的一个是-DNDEBUG,用于取消生产版本里的assert指令(注意-g并不会取消assert指令)。

-g则用于生成 debug 信息,-O0-O1-O2-O3则是不同的优化级别。

我们在编译时经常会碰到make release或者make debug,事实上它们分别是上面指令的组合:

  • make release: -DNDEBUG -O2
  • make debug: -g -O0

3. 错误信息相关

gcc 可根据选项,显示具体的编译警告和错误:

  • -Wall:大部分常见的警告信息。
  • -Wextra:比-Wall更多的警告信息。
  • -Werror:将警告视作错误,会阻止编译进行,对大多数情况下过于严厉。
  • -pedantic: ANSI/ISO C 标准所列出的所有警告。
  • -Wwarning-type:提示具体的警告类型。
  • -Wno-warning-type:不提示具体的警告类型。

常用的一个组合为:-Wall -Wextra -pedantic -Werror=return-type -Winvalid-pch -Wno-unused-parameter

4. 其它选项

  • --std=c++11:指定 C++版本。可用c++1z
  • -MD:会生成.d依赖文件,记录头文件的依赖关系,方便编译器根据修改情况来决定是否需要重新编译。通常会加上。
  • -pipe:中间文件直接放在内存,而不是显式的临时文件。通常会加上。
  • -fPIC: 生成动态链接库的目标文件时,必须添加该选项。生成静态库,但被其它动态库时用时,也需要添加该选项。
  • -share:表示生成的目标文件为动态链接库。
  • -m64:生成 64 位应用程序。r

Q. E. D.

类似文章:
相似度: 0.248
编程 » C++, GCC, 编译
C++的链接分为两部分,一个是编译时,一个是运行时。但运行时的行为也收到编译参数的影响。
相似度: 0.144
boost是除std外最常用的 C++库,覆盖很多常用操作。目前最新的版本是1.59.0
编程 » C++, gcc
follyLikely.h文件提供了 LIKELY 和 UNLIKELY 宏,提示编译器在分支预测时选择分支。其实现很简单
编程 » C++,
C++的多行宏有标准定义方式,boostfolly库都采用了这种方式:
出现的一个场景是将函数指针用 void
编程 » C++, GCC, 编译链接
LD 在链接生成目标文件时,会从左到有扫描输入的依赖库,当依赖库之间也有依赖关系时,必须将「依赖别人的库」放在「被别人依赖的库」的前面。否则会链接失败!失败的症状有:
编程 » C++, assert, 异常处理
1)在函数开始处检验传入参数的合法性
相似度: 0.081
编程 » Excel, VBA
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
编程 » C++, 编译错误
在 gcc 中,存在继承关系的模版类,子类无法直接访问父类的成员,即使该成员是protectedpublic
编程 » C++, GCC, 编译
C++的链接分为两部分,一个是编译时,一个是运行时。但运行时的行为也收到编译参数的影响。
编程 » C++, fmt
C++的fmt::format格式化库,由于效率高,功能强大,相关的 API 已经进入C++20,但其文档和 API 细节无法恭维。