编译器与工具链

编译器是 C/C++ 构建链里真正把源码变成目标文件、库和可执行文件的工具。Make、CMake、Ninja、SCons 最终都会调用编译器和链接器。

这篇只讲使用方式,不讲编译原理。

常见编译器定位

工具常见平台定位
GCC / g++Linux、MinGWGNU 编译器套件
Clang / clang++macOS、Linux、WindowsLLVM 编译器,诊断信息友好
MSVC / clWindowsVisual Studio C/C++ 编译器
MinGWWindowsWindows 上的 GCC 工具链
交叉编译器嵌入式、跨平台在当前机器生成另一个平台的程序

最小编译命令

main.cpp

#include <iostream>
 
int main()
{
    std::cout << "Hello compiler" << std::endl;
    return 0;
}

GCC:

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

Clang:

clang++ main.cpp -std=c++17 -Wall -Wextra -o app
./app

MSVC,需要在 Developer Command Prompt 或已配置环境的终端里:

cl /std:c++17 /EHsc main.cpp /Fe:app.exe
app.exe

多文件项目

目录:

hello-compiler/
├── include/
│   └── hello.h
└── src/
    ├── hello.cpp
    └── main.cpp

GCC/Clang:

g++ src/main.cpp src/hello.cpp -Iinclude -std=c++17 -o app

分步编译和链接:

g++ -Iinclude -std=c++17 -c src/main.cpp -o main.o
g++ -Iinclude -std=c++17 -c src/hello.cpp -o hello.o
g++ main.o hello.o -o app

MSVC:

cl /std:c++17 /EHsc /Iinclude src\main.cpp src\hello.cpp /Fe:app.exe

Debug / Release

类型GCC/Clang 常见参数MSVC 常见参数说明
Debug-g -O0/Zi /Od方便调试,不追求性能
Release-O2 -DNDEBUG/O2 /DNDEBUG优化性能,关闭 assert

示例:

g++ src/main.cpp src/hello.cpp -Iinclude -g -O0 -std=c++17 -o app-debug
g++ src/main.cpp src/hello.cpp -Iinclude -O2 -DNDEBUG -std=c++17 -o app-release
概念GCC/ClangMSVC作用
头文件路径-Iinclude/Iinclude让编译器找到 .h
库文件路径-Llib/link /LIBPATH:lib让链接器找到库文件
链接库-lfoofoo.lib链接具体库
宏定义-DDEBUG/DDEBUG定义预处理宏

GCC/Clang 链接示例:

g++ main.cpp -Iinclude -Llib -lfoo -o app

MSVC 链接示例:

cl /Iinclude main.cpp /Fe:app.exe /link /LIBPATH:lib foo.lib

交叉编译器

交叉编译器的名字通常带目标平台前缀:

arm-none-eabi-g++ main.cpp -mcpu=cortex-m4 -mthumb -o firmware.elf
aarch64-linux-gnu-g++ main.cpp -o app

在 CMake 中通常通过 toolchain file 指定:

cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=toolchain-arm.cmake
cmake --build build

核心命令自查表

命令作用
g++ main.cpp -o app编译并链接单文件
g++ -c main.cpp -o main.o只编译,不链接
g++ main.o hello.o -o app链接目标文件
g++ -Iinclude main.cpp -o app增加头文件搜索路径
g++ main.cpp -Llib -lfoo -o app链接库
clang++ main.cpp -o app使用 Clang 编译
cl main.cpp /Fe:app.exe使用 MSVC 编译
g++ --version查看 GCC 版本
clang++ --version查看 Clang 版本
cl查看 MSVC 是否可用

常见错误

现象原因处理
No such file or directory头文件路径没加-I/I
undefined reference声明有了,但实现没链接进来加源文件、目标文件或库
cannot find -lfoo链接器找不到库检查 -L 路径和库名
LNK2019MSVC 未解析外部符号检查 .cpp.lib 是否参与链接
cl 不是命令没进入 VS 开发者环境使用 Developer Command Prompt

注意事项

  • 真实项目不建议长期手写超长编译命令,交给 Makefile 或 CMake 管理。
  • C 和 C++ 编译器不要混用链接阶段;C++ 项目通常用 g++clang++cl 进行最终链接。
  • Windows 上要注意 x86/x64、Debug/Release、静态/动态运行库一致。