g++ 命令
#
g++
是 GNU 编译器集合(GCC)中的 C++编译器。它是一个功能强大的开源编译器,用于编译 C++源代码,支持多种 C++标准和扩展。
语法
#
常用选项
#
选项 |
描述 |
-c |
只编译不链接,生成目标文件(.o) |
-o 文件名 |
指定输出文件名 |
-g |
生成调试信息 |
-O0, -O1, -O2, -O3 |
优化级别(0-3,数字越大优化越多) |
-Wall |
启用大多数警告信息 |
-Wextra |
启用额外的警告信息 |
-Werror |
将警告视为错误 |
-I 目录 |
添加头文件搜索路径 |
-L 目录 |
添加库文件搜索路径 |
-l 库名 |
链接指定的库 |
-std=标准 |
指定 C++标准(如 c++11, c++14, c++17, c++20 等) |
-D 宏名[=值] |
定义宏 |
-E |
只进行预处理 |
-S |
只编译不汇编,生成汇编代码 |
-fPIC |
生成位置无关代码(用于共享库) |
-shared |
创建共享库 |
-m32, -m64 |
生成 32 位或 64 位代码 |
-pthread |
支持 POSIX 线程 |
-v |
显示编译过程的详细信息 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
基本用法
#
1. 编译单个源文件
#
这将编译hello.cpp
并生成可执行文件hello
。
2. 编译多个源文件
#
g++ -o program main.cpp utils.cpp helper.cpp
3. 分步编译
#
# 编译为目标文件
g++ -c main.cpp
g++ -c utils.cpp
# 链接目标文件
g++ -o program main.o utils.o
4. 使用库
#
# 使用数学库
g++ -o math_program math_program.cpp -lm
# 使用自定义库
g++ -o program main.cpp -L/path/to/libs -lmylib
5. 指定头文件路径
#
g++ -o program main.cpp -I/path/to/headers
6. 启用警告
#
g++ -Wall -Wextra -o program main.cpp
7. 生成调试信息
#
g++ -g -o program main.cpp
8. 优化代码
#
g++ -O2 -o program main.cpp
9. 指定 C++标准
#
g++ -std=c++17 -o program main.cpp
高级用法
#
1. 创建静态库
#
# 编译目标文件
g++ -c lib1.cpp lib2.cpp
# 创建静态库
ar rcs libmylib.a lib1.o lib2.o
# 使用静态库
g++ -o program main.cpp -L. -lmylib
2. 创建共享库
#
# 编译为位置无关代码
g++ -fPIC -c lib1.cpp lib2.cpp
# 创建共享库
g++ -shared -o libmylib.so lib1.o lib2.o
# 使用共享库
g++ -o program main.cpp -L. -lmylib
3. 预处理、编译、汇编和链接分步执行
#
# 预处理
g++ -E main.cpp -o main.i
# 编译为汇编代码
g++ -S main.i -o main.s
# 汇编为目标文件
g++ -c main.s -o main.o
# 链接
g++ main.o -o main
4. 使用宏定义
#
g++ -DDEBUG -DVERSION=\"1.0\" -o program main.cpp
这相当于在代码中定义了#define DEBUG
和#define VERSION "1.0"
。
5. 使用 C++特性
#
# 使用C++11特性
g++ -std=c++11 -o program main.cpp
# 使用C++14特性
g++ -std=c++14 -o program main.cpp
# 使用C++17特性
g++ -std=c++17 -o program main.cpp
# 使用C++20特性
g++ -std=c++20 -o program main.cpp
6. 生成依赖文件
#
g++ -MM main.cpp > main.d
7. 多线程编译
#
g++ -fopenmp -o parallel_program parallel.cpp
C++特定选项
#
选项 |
描述 |
-fno-exceptions |
禁用异常处理 |
-fno-rtti |
禁用运行时类型信息 |
-fvisibility=hidden |
隐藏符号可见性(提高共享库性能) |
-ftemplate-depth=N |
设置模板实例化深度限制 |
-fno-implicit-templates |
禁用隐式模板实例化 |
-fno-elide-constructors |
禁用复制构造函数省略 |
常见错误和警告
#
1. 常见编译错误
#
- 未声明的标识符:变量或函数在使用前未声明
- 语法错误:缺少分号、括号不匹配等
- 类型不兼容:尝试将不兼容的类型赋值或传递给函数
- 未定义的引用:链接时找不到函数或变量的定义
- 模板实例化错误:模板参数不匹配或约束不满足
- 重复定义:同一个符号在多个源文件中定义
2. 常见警告
#
- 未使用的变量:声明了但未使用的变量
- 隐式转换:可能导致数据丢失的类型转换
- 符号隐藏:派生类中的函数隐藏了基类中的同名函数
- 过时的特性:使用了被标记为过时的 C++特性
优化选项
#
优化级别 |
描述 |
-O0 |
不优化(默认),编译速度最快,调试体验最好 |
-O1 |
基本优化,编译时间稍长,生成的代码运行更快 |
-O2 |
更多优化,几乎所有支持的不涉及空间-速度权衡的优化 |
-O3 |
最高级别优化,包括函数内联等激进优化 |
-Os |
优化代码大小,执行可能比-O2 慢 |
-Og |
优化调试体验,在-O1 的基础上禁用影响调试的优化 |
实用示例
#
1. 编译带调试信息的程序
#
g++ -g -Wall -o debug_program main.cpp
2. 编译优化的发布版本
#
g++ -O2 -DNDEBUG -o release_program main.cpp
3. 使用 C++17 标准和所有警告
#
g++ -std=c++17 -Wall -Wextra -Wpedantic -o program main.cpp
4. 编译使用 STL 和 Boost 库的程序
#
g++ -std=c++17 -o program main.cpp -lboost_system -lboost_filesystem
5. 创建和使用动态库
#
# 创建动态库
g++ -std=c++17 -fPIC -shared -o libmyclass.so myclass.cpp
# 使用动态库
g++ -std=c++17 -o program main.cpp -L. -lmyclass -Wl,-rpath,.
6. 使用 sanitizers 检测问题
#
# 地址sanitizer检测内存错误
g++ -fsanitize=address -o program main.cpp
# 线程sanitizer检测数据竞争
g++ -fsanitize=thread -o program main.cpp
# 未定义行为sanitizer
g++ -fsanitize=undefined -o program main.cpp
C++标准支持
#
标准 |
选项 |
主要特性 |
C++98/03 |
-std=c++98 |
基本的 C++特性、STL |
C++11 |
-std=c++11 |
auto、lambda、智能指针、线程库、正则表达式 |
C++14 |
-std=c++14 |
泛型 lambda、返回类型推导、变量模板 |
C++17 |
-std=c++17 |
结构化绑定、if constexpr、std::optional、并行算法 |
C++20 |
-std=c++20 |
概念、协程、范围、模块、三向比较 |
与其他 C++编译器的比较
#
编译器 |
优点 |
缺点 |
适用场景 |
G++ |
开源、广泛支持、多平台 |
错误信息可能不够清晰 |
通用 C++开发、Linux 系统 |
Clang++ |
清晰的错误信息、快速编译 |
某些平台支持不如 G++ |
开发环境、需要良好诊断的项目 |
MSVC++ |
Windows 集成、优化的 Windows 代码 |
仅限 Windows 平台 |
Windows 应用程序开发 |
Intel C++ |
高度优化、特别是 Intel 处理器 |
商业软件、价格昂贵 |
高性能计算、需要极致优化 |
提示和技巧
#
1. 使用预编译头文件加速编译
#
# 创建预编译头文件
g++ -std=c++17 -x c++-header stdafx.h -o stdafx.h.gch
# 使用预编译头文件
g++ -std=c++17 -include stdafx.h -o program main.cpp
2. 生成代码覆盖率报告
#
g++ -fprofile-arcs -ftest-coverage -o program main.cpp
./program
gcov main.cpp
3. 使用链接时优化
#
g++ -flto -O3 -o program main.cpp utils.cpp
4. 生成性能分析信息
#
g++ -pg -o program main.cpp
./program
gprof program > profile.txt
5. 检查代码风格和潜在问题
#
结合静态分析工具使用:
g++ -Wall -Wextra -o program main.cpp
cppcheck main.cpp
扩展阅读
#