环境配置

建议先阅读:01_下载与安装

原理

PATH 环境变量是操作系统查找可执行文件的搜索路径列表——当输入 g++ 时,系统按 PATH 顺序在各目录中查找名为 g++ 的可执行文件。

编译过程的四个阶段:

  1. 预处理:展开 #include#define,生成 .i 文件
  2. 编译:将预处理后的代码转为汇编,生成 .s 文件
  3. 汇编:将汇编转为机器码,生成 .o 目标文件
  4. 链接:将目标文件与库文件合并,解析符号引用,生成可执行文件

编译器选项的底层影响:

  • -O0 禁用优化,每行 C++ 代码直译,方便单步调试
  • -O2 执行大部分优化(常量折叠、死代码消除、循环展开等),是发布版标准
  • -g 在二进制中嵌入 DWARF 调试信息(源文件映射、变量名、行号表),文件体积显著增大
  • -fsanitize=address 在编译时插入内存检查桩代码,堆/栈缓冲区溢出在运行时被捕获

建议先阅读:04_第一个程序与输入输出


语法

PATH 配置

# 查看当前 PATH (Linux/macOS)
echo $PATH
 
# 临时追加
export PATH="/usr/local/gcc/bin:$PATH"
 
# 永久配置,写入 ~/.bashrc 或 ~/.zshrc
echo 'export PATH="/usr/local/gcc/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

核心编译选项

类别选项作用
标准-std=c++17指定 C++ 标准版本
警告-Wall -Wextra -Wpedantic启用常见警告
优化-O0 / -O2 / -O3优化级别
调试-g嵌入调试信息
诊断-fsanitize=address运行时内存错误检测
输入/输出-c / -o file只编译 / 指定输出名
路径-I dir / -L dir / -l lib头文件路径 / 库路径 / 库文件

推荐开发期命令:

g++ -std=c++17 -Wall -Wextra -Wpedantic -g -o app main.cpp

推荐发布期命令:

g++ -std=c++17 -O2 -DNDEBUG -o app main.cpp

Makefile 基础

CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -g
 
app: main.o utils.o
	$(CXX) -o $@ $^
 
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c -o $@ $<
 
clean:
	rm -f *.o app
 
.PHONY: clean

自动变量:$@=目标, $<=首个依赖, $^=全部依赖

CMake 基础

cmake_minimum_required(VERSION 3.16)
project(MyApp LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(myapp main.cpp utils.cpp)
mkdir build && cd build
cmake ..
cmake --build .

CMake 是构建系统生成器,不直接编译;它生成 Makefile/Ninja 文件,再由这些工具执行编译。

GDB 调试

命令作用
break main / break 15设置断点
run启动程序
next单步跳过 (不进入函数)
step单步进入函数
print x打印变量值
backtrace查看调用栈
continue继续执行
g++ -std=c++17 -g -o app main.cpp
gdb ./app

实践

多文件编译练习——创建 math_utils.h, math_utils.cpp, main.cpp,分别用 Makefile 和 CMake 构建。

常见编译错误速查:

错误信息原因解决
undefined reference to 'foo()'链接阶段缺符号添加源文件或 -l
No such file or directory找不到头文件-I include_path
multiple definition of重复定义头文件用 externinline

力扣: 简单计算题

AI 自检提示:让 AI 逐行解释一个 Makefile 的执行逻辑,理解每个 $@$< 的含义。