g++命令

g++ 命令 #

g++是 GNU 编译器集合(GCC)中的 C++编译器。它是一个功能强大的开源编译器,用于编译 C++源代码,支持多种 C++标准和扩展。

语法 #

g++ [选项] [文件...]

常用选项 #

选项 描述
-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. 编译单个源文件 #

g++ -o hello hello.cpp

这将编译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

扩展阅读 #