与 GCC 一起编译

假设一个名为 main.cpp 的源文件,编译和链接未优化的可执行文件的命令如下(没有优化的编译对于初始开发和调试很有用,尽管 -Og 正式推荐用于较新的 GCC 版本)。

g++ -o app -Wall main.cpp -O0

要生成用于生产的优化可执行文件,请使用 -O 选项之一(请参阅: -O1-O2-O3-Os-Ofast ):

g++ -o app -Wall -O2 main.cpp

如果省略 -O 选项,则使用 -O0(这意味着不进行优化)作为默认值(指定 -O 而不将数字解析为 -O1)。

或者,直接使用 O 组(或更多实验优化)的优化标记。以下示例使用 -O2 优化构建,加上 -O3 优化级别的一个标志:

g++ -o app -Wall -O2 -ftree-partial-pre main.cpp

要生成特定于平台的优化可执行文件(用于具有相同体系结构的计算机上的生产),请使用:

g++ -o app -Wall -O2 -march=native main.cpp

上述任何一个都会生成一个二进制文件,可以在 Windows 上运行 .\app.exe,在 Linux,Mac OS 等运行 ./app

-o 标志也可以跳过。在这种情况下,GCC 将在 Windows 上创建默认输出可执行文件 a.exe,在类 Unix 系统上创建 a.out。要编译文件而不链接它,请使用 -c 选项:

g++ -o file.o -Wall -c file.cpp

这会生成一个名为 file.o 的目标文件,以后可以将其与其他文件链接以生成二进制文件:

g++ -o app file.o otherfile.o

有关优化选项的更多信息,请访问 gcc.gnu.org 。特别值得注意的是 -Og(优化强调调试经验 - 推荐用于标准编辑 - 编译 - 调试循环)和 -Ofast(所有优化,包括无视严格标准合规的优化)。

-Wall 标志启用警告,许多常见的错误,应始终使用。为了提高代码质量,通常还鼓励使用 -Wextra 和其他警告标志,这些标志不是由 -Wall-Wextra 自动启用的。

如果代码需要特定的 C++标准,请通过包含 -std= 标志来指定要使用的标准。支持的值对应于每个 ISO C++标准版本的最终确定年份。从 GCC 6.1.0 开始,std= 标志的有效值为 c++98 / c++03c++11c++14c++17 / c++1z。由正斜杠分隔的值是等效的。

g++ -std=c++11 <file>

GCC 包括一些特定于编译器的扩展,当它们与 -std= 标志指定的标准冲突时被禁用。要在启用所有扩展的情况下进行编译,可以使用值 gnu++XX,其中 XX 是上面列出的 c++值使用的任何年份。

如果未指定,则将使用默认标准。对于 6.1.0 之前的 GCC 版本,默认为 -std=gnu++03; 在 GCC 6.1.0 及更高版本中,默认为 -std=gnu++14

请注意,由于 GCC 中的错误,-pthread 标志必须出现在 GCC 的编译和链接中,以支持 C++ 11 引入的 C++标准线程功能,例如 std::threadstd::wait_for。在使用线程函数时省略它可能会导致没有警告,但在某些平台上会产生无效结果

与库联系:

使用 -l 选项传递库名称:

g++ main.cpp -lpcre2-8
#pcre2-8 is the PCRE2 library for 8bit code units (UTF-8)

如果库不在标准库路径中,请使用 -L 选项添加路径:

g++ main.cpp -L/my/custom/path/ -lmylib

多个库可以链接在一起:

g++ main.cpp -lmylib1 -lmylib2 -lmylib3

如果一个库依赖于另一个库,则将依赖库放在独立库之前

g++ main.cpp -lchild-lib -lbase-lib

或者让链接器通过 --start-group--end-group 确定排序本身(注意:这有很大的性能成本):

g++ main.cpp -Wl,--start-group -lbase-lib -lchild-lib -Wl,--end-group