补充说明
g++ 是 GNU Compiler Collection(GCC)中的 C++ 编译器驱动,负责调用预处理器、编译器、汇编器和链接器,把 .cpp 等源文件编译成可执行文件或目标文件。它随 gcc 软件包一起安装,在 Debian/Ubuntu 上包名为 g++,在 RHEL 系上为 gcc-c++。
日常使用时 g++ 既是编译命令也是链接命令:加 -c 只生成 .o,不加 -c 则直接链接成可执行文件。编译器默认标准随版本变化,写进构建脚本时应显式指定 -std=,例如 -std=c++17 或 -std=c++20。
g++ 与 gcc 的区别主要在默认语言和默认链接的 C++ 标准库(libstdc++)。用 gcc 编译 C++ 源文件需要手动加 -lstdc++,因此编译 C++ 程序应始终使用 g++。
语法
g++ [选项] 源文件...
选项
-o 文件:指定输出文件名,缺省为a.out-c:只编译/汇编,不链接,生成.o-std=c++17:指定语言标准(c++11、c++14、c++17、c++20、c++23)-Wall -Wextra:开启常用警告,建议开发期常开-g:生成调试信息,供 gdb 使用-O0/-O1/-O2/-O3:优化级别,-O2是发布版本常用选择-I 目录:添加头文件搜索路径-L 目录:添加库文件搜索路径-l 库名:链接库,如-lpthread、-lm-pthread:启用 POSIX 线程并链接线程库-D 宏[=值]:在命令行定义预处理宏-E / -S:只做预处理 / 只生成汇编-fPIC -shared:生成位置无关代码并制作共享库-fsanitize=address:启用 AddressSanitizer 检查内存错误-MM:输出 Makefile 风格的依赖关系
实例
# 编译单个源文件并生成可执行文件
g++ -std=c++17 -Wall -O2 hello.cpp -o hello
# 分步编译:先生成目标文件,再链接多个目标文件
g++ -std=c++17 -c main.cpp util.cpp
g++ main.o util.o -o app
# 带调试信息编译,供 gdb 调试
g++ -std=c++17 -g -O0 main.cpp -o app-debug
# 指定头文件和库路径,链接数学库
g++ -I./include -L./lib main.cpp -lm -o app
# 制作共享库
g++ -std=c++17 -fPIC -shared foo.cpp -o libfoo.so
# 开启内存错误检测运行
g++ -std=c++17 -fsanitize=address -g main.cpp -o app-asan
./app-asan