5

常见 GCC C++ 编译选项

 3 years ago
source link: https://zhiqiang.org/coding/gcc-compile-paras.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一个典型的 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.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK