Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← C++ 编程 / C++ Programming

环境、工具链与构建系统 / Environment & Toolchain

1. C++ 环境与工具链总览 / C++ Environment And Toolchain Overview

2. 开发环境:一条命令背后的工作现场 / Development Environment

3. 编译器工具链:GCC、Clang、MSVC、MinGW 与 clang-cl / Compiler Toolchains

4. 预处理和翻译单元:include、宏、条件编译与编译输入 / Preprocessing And Translation Unit

5. 目标文件、符号和 ABI:.o/.obj 里到底有什么 / Object Files, Symbols, And ABI

6. 链接、静态库、动态库和运行库 / Linking, Static Libraries, Dynamic Libraries, And Runtime

7. 构建执行器:Make、Ninja、MSBuild 与增量构建 / Build Executors

8. 构建生成器和 CMake:从项目描述到构建图 / Build Generators And CMake

9. 依赖管理:三方库、包管理器和路径边界 / Dependency Management

10. 调试和诊断:从失败现象回到工程阶段 / Debugging And Diagnostics

11. 平台、发布和复现:让 C++ 程序离开你的机器 / Platform, Release, And Reproducibility

本页目录

C++ 环境与工具链总览 / C++ Environment And Toolchain Overview ​

本模块不是工具名词表。

它要把 C++ 项目从“源码躺在目录里”到“程序被构建、运行、调试、发布”的整条环境链讲清楚。

很多 C++ 学习资料会先讲语法,再讲 STL,再讲并发。

这些当然重要。

但真正开始做项目时,很多人卡住的地方往往是:

text
CMake 找不到编译器
头文件找不到
库文件找不到
Debug 能编 Release 不能编
Windows 能跑 Linux 不能跑
IDE 能运行命令行不能运行
复制 exe 到另一台机器就提示 DLL 缺失
1
2
3
4
5
6
7

这些问题都不是单纯的“C++ 语言问题”。

它们属于 C++ 项目的工作环境和工具链问题。

1. 本模块的主线 ​

text
源码目录
  |
  v
开发环境
  |  terminal / shell / PATH / working directory / SDK
  v
编译器工具链
  |  GCC / Clang / MSVC / MinGW / clang-cl
  v
预处理和翻译单元
  |  include / macro / conditional compilation
  v
目标文件、符号和 ABI
  |  object file / symbol / relocation / name mangling
  v
链接和运行库
  |  static library / dynamic library / loader / runtime
  v
构建执行器
  |  Make / Ninja / MSBuild
  v
构建生成器
  |  CMake / Meson / GN
  v
依赖管理
  |  vcpkg / Conan / pkg-config / FetchContent / Xmake packages
  v
调试和诊断
  |  gdb / lldb / VS debugger / sanitizer / static analysis
  v
平台、发布和复现
     Windows / Linux / macOS / Debug / Release / CI
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

这条线不是为了把名词排得好看。

它是排错路线。

看到报错时,第一步不是复制搜索结果。

第一步是判断错误发生在哪一层:

text
命令找不到
  -> 开发环境 / PATH

语法或类型错误
  -> 编译器前端

头文件找不到
  -> 预处理 / include search

undefined reference / unresolved external
  -> 链接 / 符号解析

DLL not found / libxxx.so not found
  -> 运行时装载

CMake configure failed
  -> 构建生成 / 工具链探测 / 包查找

Debug 看不到变量
  -> 调试信息 / 优化级别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

2. 为什么环境要放在第一篇 ​

C++ 工具链不像一个单独按钮。

它更像一组互相寻找的程序:

text
shell 找编译器
编译器找头文件
链接器找库文件
可执行文件找动态库
调试器找调试信息
构建系统找项目描述和工具链
1
2
3
4
5
6

只要其中一个寻找规则错了,项目就会失败。

所以环境不是“装软件”这么简单。

环境是让这些寻找规则对齐。

3. 文章阅读顺序 ​

text
00-overview
  |
  v
01-development-environment
  |
  v
02-compiler-toolchains
  |
  v
03-preprocessing-and-translation-unit
  |
  v
04-object-files-symbols-and-abi
  |
  v
05-linking-static-dynamic-runtime
  |
  v
06-build-executors
  |
  v
07-build-generators-and-cmake
  |
  v
08-dependency-management
  |
  v
09-debugging-and-diagnostics
  |
  v
10-platform-release-and-reproducibility
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

如果你只想快速建立全局感,可以先读 01、02、05、07、08、09。

如果你正在排查链接或 DLL 问题,可以先读 04、05、08、10。

如果你正在学习 CMake,可以先读 01、02、06、07、08。

4. 每篇文章解决什么问题 ​

text
01 开发环境
  终端、shell、当前目录、PATH、环境变量、SDK、IDE

02 编译器工具链
  GCC、Clang、MSVC、MinGW、clang-cl、标准库、运行库

03 预处理和翻译单元
  include、宏、条件编译、编译器真正看到的输入

04 目标文件、符号和 ABI
  .o/.obj、section、symbol、relocation、name mangling、ABI

05 链接和运行库
  静态库、动态库、导入库、链接顺序、运行时装载

06 构建执行器
  Make、Ninja、MSBuild、依赖图、增量构建

07 构建生成器和 CMake
  CMake、Meson、GN、configure/generate/build、target 模型

08 依赖管理
  系统包、pkg-config、FetchContent、vcpkg、Conan、Xmake packages

09 调试和诊断
  调试信息、gdb、lldb、PDB、DWARF、Sanitizer、静态分析

10 平台发布和复现
  Windows/Linux/macOS、架构、Debug/Release、CI、部署记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

5. 学习方法 ​

每学一个工具,都问五个问题:

text
1. 它站在哪一层?
2. 它的输入是什么?
3. 它的输出是什么?
4. 它调用谁?
5. 它失败时通常报什么错?
1
2
3
4
5

例如 CMake:

text
层级
  构建生成器

输入
  CMakeLists.txt、toolchain file、cache、环境变量、包配置

输出
  Ninja files、Makefiles、Visual Studio project 等

调用
  编译器探测、包查找、后端构建工具

失败
  configure failed、package not found、compiler not detected
1
2
3
4
5
6
7
8
9
10
11
12
13
14

例如 Ninja:

text
层级
  构建执行器

输入
  build.ninja

输出
  编译产物、链接产物、复制产物

调用
  compiler、linker、custom command

失败
  command failed、missing dependency、rule error
1
2
3
4
5
6
7
8
9
10
11
12
13
14

例如 Xmake:

text
层级
  一体化构建工具和包管理工作台

输入
  xmake.lua、toolchain 配置、package 配置

输出
  构建产物、依赖包、可选工程文件

调用
  编译器、链接器、包下载和构建流程

失败
  toolchain not found、package build failed、link failed
1
2
3
4
5
6
7
8
9
10
11
12
13
14

6. 常见误解 ​

text
装了编译器 = 环境配置好了

实际:
编译器文件存在
  != shell 能找到它
  != 构建系统选中了它
  != 它能找到 SDK、标准库和链接器
1
2
3
4
5
6
7
text
CMake 编译了我的程序

实际:
CMake 通常负责生成构建系统
真正编译的是 GCC / Clang / MSVC
真正执行命令的是 Ninja / Make / MSBuild 等后端
1
2
3
4
5
6
text
链接成功 = 程序一定能运行

实际:
链接成功说明链接器找到了一组符号和库
运行成功还需要操作系统装载器找到动态库和运行库
1
2
3
4
5

7. 最小实践任务 ​

text
实践 1:
在两个不同终端中分别运行 cmake --version、ninja --version、g++ --version、clang++ --version、cl。
记录哪些命令可用,路径是否相同。

实践 2:
用一条 g++ 命令编译 hello.cpp。
分别故意制造源文件路径错误、头文件路径错误、链接库错误、动态库运行时错误。
观察报错来自哪个阶段。

实践 3:
用 CMake + Ninja 构建一个两文件项目。
打开 build 目录,观察 CMakeCache.txt 和 build.ninja。
1
2
3
4
5
6
7
8
9
10
11
12

8. 本篇总结 ​

text
源码不会自己变成程序

程序是工具链和环境共同生产出来的结果

环境决定工具能不能找到彼此
工具链决定源码怎样变成目标文件
链接决定符号和库怎样拼成程序
运行环境决定程序能不能加载依赖
调试信息决定失败能不能被观察
构建系统决定这些步骤怎样规模化和复现
1
2
3
4
5
6
7
8
9
10

下一篇从最基础但最容易被忽视的问题开始:为什么一条命令能在这个终端运行,却不能在另一个终端运行?

最后更新于:

Pager
上一篇← C++ 编程 / C++ Programming
下一篇2. 开发环境:一条命令背后的工作现场 / Development Environment

持续记录,持续成长

Copyright © Tidenflow