与 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++03
,c++11
,c++14
和 c++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::thread
和 std::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