g++编译命令

C++程序编译与相关选项

编译基本概念

g++是GNU C++编译器,是Linux环境下编译C++程序最常用的工具。

编译过程

C++程序从源代码到可执行文件需要经历以下阶段:

  1. 预处理:处理 #include、#define 等指令
  2. 编译:将预处理后的代码翻译成汇编代码
  3. 汇编:将汇编代码转换成机器码(目标文件)
  4. 链接:将目标文件和库文件链接生成可执行文件

基本用法


# 最基本的编译命令
g++ main.cpp

# 指定输出文件名
g++ main.cpp -o main

# 编译并立即运行
g++ main.cpp -o main && ./main

# 编译多个文件
g++ main.cpp utils.cpp -o program

# 只编译不链接(生成目标文件)
g++ -c main.cpp        # 生成 main.o
g++ -c utils.cpp       # 生成 utils.o
g++ main.o utils.o -o program
                

常用编译选项

输出与文件

-o <文件名> 指定输出文件名
-c 只编译不链接,生成 .o 目标文件

警告选项

-Wall 显示所有警告信息(强烈推荐)
-Wextra 显示额外的警告信息
-Werror 将警告视为错误,必须修复才能编译

标准版本

-std=c++11 使用C++11标准
-std=c++14 使用C++14标准
-std=c++17 使用C++17标准
-std=c++20 使用C++20标准

调试信息

-g 生成调试信息(GDB需要)
-ggdb 生成GDB专用的调试信息

优化选项

-O0 不优化(默认,适合调试)
-O1 基本优化
-O2 推荐优化级别(平衡速度和体积)
-O3 最高优化(可能增加体积,比赛常用)

编译示例

示例1:开发调试


# 包含警告、调试信息、C++17标准
g++ -Wall -Wextra -g -std=c++17 main.cpp -o main
                

示例2:提交代码


# 最高优化、C++17标准
g++ -O3 -std=c++17 main.cpp -o main
                

示例3:多文件项目


# 编译所有.cpp文件
g++ -std=c++17 -O3 -Wall *.cpp -o program

# 或者分别编译再链接
g++ -std=c++17 -c main.cpp
g++ -std=c++17 -c solution.cpp
g++ -std=c++17 -c tools.cpp
g++ main.o solution.o tools.o -o program
                

交互式编译演示

$

尝试输入:g++ main.cpp -Wall 或 g++ main.cpp -O2

常见编译错误

语法错误

main.cpp:5:10: error: expected ';' before '}' token
5 | return 0
^

未定义的引用

/tmp/cc12345.o: In function `main':
main.cpp:(.text+0x10): undefined reference to `solve()'
collect2: error: ld returned 1 exit status

警告信息

main.cpp:3:5: warning: unused variable 'x' [-Wunused-variable]
3 | int x;
^

警告不会阻止编译,但建议修复!使用 -Werror 可以将警告转为错误。

优化级别对比

级别 说明 适用场景
-O0 不优化 开发调试(最快编译,最慢执行)
-O1 基本优化 需要速度但体积敏感
-O2 推荐优化 大多数情况(平衡速度和体积)
-O3 最高优化 NOI竞赛(追求最快速度)

实用技巧

推荐编译命令模板


# 调试版本
alias debug="g++ -Wall -Wextra -g -std=c++17 -DDEBUG"

# 提交版本
alias submit="g++ -Wall -O3 -std=c++17 -DNDEBUG"

# 使用
debug main.cpp -o main    # 调试编译
submit main.cpp -o main   # 提交编译
                    

Makefile 简化编译


CXX = g++
CXXFLAGS = -std=c++17 -O2 -Wall

main: main.cpp
    $(CXX) $(CXXFLAGS) main.cpp -o main

clean:
    rm -f main main.o
                    

保存为 Makefile,然后使用 make 编译。