Linux 命令速查
开发工具 man g++

g++

GNU 的 C++ 编译器

返回

补充说明

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

参考链接