写C++写到一定程度,早晚会撞上一堵墙:你的项目已经不再是一个单文件了。以前靠一条 g++ main.cpp -o app 就能跑起来的小练习,慢慢变得需要几十个源文件、多个目录、还要链接第三方库。这时候如果还在手动敲编译命令,不仅累,还容易漏文件、漏参数。我自己的经历是,第一次在 Linux 服务器上拿到一个只有 .cpp 和 .h 的工程包,没有 VS 项目文件、没有 Makefile,面对满屏源文件根本不知道从哪里下手。后来认真把 CMake 这套编译工具打通之后,才意识到这几乎是现代 C++ 工程的“通用项目描述语言”。
这篇文章想解决的不只是“怎么装 CMake”的问题,而是把从安装、CMakeLists.txt 编写、Windows/MSVC 工具链匹配、VS 构建后找不到 exe、Qt 里认不到编译器,到常见的链接错误、版本过低报错这一整条链路上的关键经验都整理出来。适合刚学 C++ 没多久、想用 VSCode 或 VS 正经管理项目的人,也适合已经把 CMake 用起来但经常被各种工具链问题卡住的读者。
1. 先说清楚:C++ 项目为什么需要 CMake 这样的编译工具
1.1 从手动编译到构建系统:你卡在哪一步,才需要它
很多人第一次意识到“需要 CMake”,场景出奇一致。单文件时:
bash复制g++ main.cpp -o app
一切都很美好。等到文件多起来,变成了:
bash复制g++ main.cpp sort.cpp network.cpp http_parser.cpp -I./include -L./lib -lcurl -o app
这条命令已经不好记了,但还能忍。真正让你崩溃的是,要同时交付 Windows 版、Linux 版,甚至某个 ARM 板子上的版本。编译器从 g++ 换成 cl.exe 之后,参数完全不同;依赖库的路径在不同机器上也未必相同怎么办。手动编译这条路在源文件数量上去之后是走不通的,这就是你开始找“编译工具”的根本原因。
CMake 解决的是这一层的痛点:它让你用一份 CMakeLists.txt 描述“项目里有哪些文件、有哪些可执行程序/库、谁依赖谁、用哪个 C++ 标准、需要找哪些第三方包”,然后由 CMake 根据当前平台和编译器,自动生成对应的 Makefile、Ninja 文件或 Visual Studio 工程。
1.2 CMake 到底是什么:它不是编译器,而是“构建系统生成器”
CMake 这个名字容易让人误解,以为它参与了“编译”。实际上它不编译任何东西,只是一个用来生成构建规则的工具。真正的编译动作,仍然由 g++、cl.exe、clang++ 这些编译器完成。
可以这样理解:你的源码是原材料,项目里的文件关系是需求说明书,CMake 是中间人。它读取 CMakeLists.txt,识别你当前用的是 Windows、Linux 还是 macOS,找到可用的编译器,然后给你生成一套能让编译器干活的脚本或工程文件。
比如在 Linux 上,CMake 通常会生成 Makefile,之后你执行 make 才会真正调 g++;在 Windows 上它能生成 xxx.sln,让你直接用 Visual Studio 打开、点“生成”来完成编译。关键好处是,同一份 CMakeLists.txt 换一个平台无需重写,这正是它成为 C++ 生态“通用语”的原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 吃透 CMakeLists.txt:几个关键点直接决定成败
2.1 最小可用模板:第一行和第二行都别省
一个能跑的 C++ 工程,CMakeLists.txt 至少需要三部分内容:
cmake复制cmake_minimum_required(VERSION 3.16)
project(HelloDemo CXX)
add_executable(hello main.cpp)
第一行的 cmake_minimum_required 写的是 CMake 自身的最低版本,必须放在文件最前面。不少人在这行吃了亏:如果本地 CMake 版本比这行要求的版本老,CMake 会直接终止,不给你任何往下执行的机会。网上爆出“CMake 3.26 or higher is required. You are running version 2.8.12.2”这类错误,基本就是同一个原因。
第二行的 project() 也不建议省略。它不只是给项目起个名字,还承担了“声明语言”的任务,后面加了 CXX 表示这是一个 C++ 工程,CMake 才知道去探测 C++ 编译器。只写源文件列表而省略 project 行,很多新版本里会报“project() should be called before add_executable”之类的警告或错误。
2.2 target 才是 CMake 真正理解的对象
这段是重点。写过几段 CMakeLists 的人应该会发现,add_executable、add_library 的命令开头都定义了一个“target”,也就是构建目标。CMake 在设计上一切都以 target 为中心,文件之间的依赖关系、头文件目录、链接关系都尽量挂在 target 上,而不是全局。
看一个稍完整的例子,把冒泡排序单独编译成一个静态库,主程序再链接它:
cmake复制cmake_minimum_required(VERSION 3.16)
project(BubbleDemo CXX)
add_library(bubble_sort STATIC src/bubble.cpp)
target_include_directories(bubble_sort PUBLIC include)
add_executable(demo main.cpp)
target_link_libraries(demo PRIVATE bubble_sort)
这里 bubble_sort 是一个静态库 target,demo 是最终可执行程序 target。target_include_directories 让库本身能找到头文件,并且因为设成了 PUBLIC,链接它的 target 也会自动带上 include 目录,所以 demo 里写的 #include "bubble.h" 能正常被找到。如果你用的是 PRIVATE,那 include 目录就只对库自己生效。
为什么建议把依赖挂在 target 上而不是用老式写法 include_directories()?因为那会污染所有目标。一旦工程大起来,多个 target 用了不同版本的同名头文件,全局设置会带来“玄学”错误。这是个迟早要改的习惯,越早用 target 写法越好。
2.3 C++ 标准、头文件路径、源文件列表怎么管理最顺手
C++ 11/14/17/20 的切换可以通过 CMAKE_CXX_STANDARD 控制。最省事的写法是:
cmake复制set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
第一行指定标准版本,第二行表示如果编译器不支持这个标准直接报错,而不是默默降级;第三行则让你用的是 -std=c++17 而不是 GNU 扩展模式 -std=gnu++17。实测下来,做算法题或写普通应用,这一组配置能避免很多“本机编译好,换台机器行为就变”的问题。
源文件列表有两种写法。一种是直接列出:
cmake复制add_executable(demo main.cpp source1.cpp source2.cpp)
项目小的时候,我强烈建议直接列,清爽好检查。另一种自动收集:
cmake复制file(GLOB_RECURSE SRC CONFIGURE_DEPENDS src/*.cpp)
add_executable(demo ${SRC})
GLOB 会自动把 src 目录下所有 .cpp 收进来,省去手工维护列表的麻烦。代价是 CMake 有时不会在你新增文件后自动感知变化,需要重新跑一次配置。虽然 CONFIGURE_DEPENDS 能缓解这个问题,但也不是所有生成器都可靠。做个人项目可以这么玩,给别人交付工程时还是老老实实列出来比较好。
2.4 用“冒泡排序练习工程”把上述概念串起来
假设现在有个练习,路径结构如下:
code复制practice/
├── CMakeLists.txt
├── include/
│ └── bubble.h
├── src/
│ └── bubble.cpp
└── main.cpp
头文件里声明排序函数:
cpp复制#pragma once
void bubble_sort(int arr[], int n);
src/bubble.cpp 实现一个最朴素的冒泡排序。主函数里放一个无序数组,调用 bubble_sort 后打印结果。
CMakeLists.txt 采用前面那套 target 写法,就可以在项目根目录执行:
bash复制cmake -S . -B build
cmake --build build --config Release
-S 是指定 CMakeLists.txt 所在源码目录,-B 是指定构建目录,构建产物会全部放进 build 而不是混进源码目录。这一步是很多人最初都会忽略的细节。理解了这个小工程,你就已经掌握了 CMake 最基本的工作流程,后面无论是加第三方库还是拆出多个子目录,思路都是在同一套 target 逻辑上扩展。
3. 工具链配置是新手劝退重灾区,尤其是 Windows
3.1 为什么 Qt 6 自带 msvc2022 64 工具链,CMake 却认不到
这个问题我在相关提问里见过多次:明明安装了 Qt 6,安装目录里也能看到 msvc2022_64 之类的目录,可到了 Qt Creator 里创建项目,就会发现“没有可用的编译套件”,或者说 CMake 配置时找不到编译器。很多人第一反应是 Qt 安装坏了,或者 CMake 装错版本。
真实原因通常是:Qt 安装目录里的 msvc2022_64 只是 Qt 针对 MSVC 编译器预先编译好的库文件,它不包含编译器本体。MSVC 编译器(cl.exe、link.exe)是由 Visual Studio 或者独立的“Build Tools for Visual Studio”安装的,并且还需要安装“使用 C++ 的桌面开发”工作负载。如果你只装了 Qt 没有装 VS 的 C++ 工具集,那 Qt 即使在目录里写了 msvc 后缀,也没有实际可用的编译器,CMake 自然认不到。
所以配置 Qt 工具链的正确路径是:先装 Visual Studio 并勾选 C++ 桌面开发,再装 Qt,最后在 Qt Creator 的 Kit 设置里指定编译器路径,通常是 VS 安装目录下的 cl.exe。Qt 目录本身只是库的所在地,不是编译器来源。
3.2 最稳妥的解法:从 VS 开发者命令行开始配 CMake
Windows 上 CMake 找不到 MSVC 的问题,我自己也踩过坑。后来发现最稳定的解法是从“x64 Native Tools Command Prompt for VS 2022”这个开发者命令行窗口开始操作。这个窗口是 Visual Studio 自带的入口,它提前帮你设置好了 INCLUDE、LIB、PATH 等环境变量,让 cl.exe 能被 CMake 正常找到。
在这个窗口里先敲:
bash复制where cl
能看到 cl.exe 路径,说明环境正常。然后执行:
bash复制cmake -S . -B build -G "Visual Studio 17 2022" -A x64
-G 指定生成器,-A 指定架构。如果你装的是 VS2019,生成器名对应 Visual Studio 16 2019;VS2022 就是 Visual Studio 17 2022。用 Ninja 做生成器时也要在这个窗口里跑,否则 Ninja 找不到 cl。不少人在普通 CMD 或 PowerShell 里直接跑 CMake,然后报错说“无法找到编译器”,十有八九是没走这个开发者环境。
3.3 MinGW、MSYS2、WSL 下用 CMake 的差异对比
不是所有人都走 MSVC 路线。有人用 VSCode 配 MinGW,有人习惯 MSYS2,也有人用 WSL 做开发。用 CMake 时这些东西到底有什么区别?我列个简单对比:
| 环境 | 常用生成器 | 关键要求 | 适合场景 |
|---|---|---|---|
| Windows + MSVC | Visual Studio 17 2022 / Ninja | 从 VS 开发者命令行运行,能定位 cl.exe | 原生 Windows 应用、Qt/OpenCV 等主流生态 |
| Windows + MinGW | MinGW Makefiles | PATH 中包含 g++、mingw32-make | 轻量 C++ 练习、不想装 VS |
| Windows + MSYS2 | MSYS2 Makefiles / Ninja | 在 MSYS2 shell 内执行,避免路径混淆 | 需要 pacman 管理依赖的工程 |
| WSL / Linux | Unix Makefiles / Ninja | CMake 在 Linux 环境中运行,不要在跨文件系统目录上跑 | 服务器开发、部署前编译验证 |
用 MinGW 时要注意一个细节:MinGW 的 make 命令通常叫 mingw32-make.exe,不叫 make.exe,因为要和 MSYS 自带的 make 区分。CMake 选择 MinGW Makefiles 生成器时,会自动寻找 mingw32-make。如果你用 IDE 或脚本手动调 make,别搞错命令名。
3.4 Linux / macOS / 树莓派上,先确认 CMake 版本再谈其他
到了 Linux 环境,问题往往不是找不到编译器,而是系统里自带的 CMake 版本太老。Ubuntu 18.04 默认的 CMake 还在 3.10 左右,如果你拿到一个需要 CMake 3.26 的工程,一配置就会得到开头那种“version is too old”的直接终止。树莓派上这个问题更明显,系统源里的 CMake 版本可能落后主版本好几年。
遇到这种场景,优先考虑用官方提供的二进制包。下载 Linux x86_64 或 ARM 的 .tar.gz,解压到 /opt/cmake 或用户目录,然后设置 PATH:
bash复制export PATH=/opt/cmake/bin:$PATH
如果只是临时编译一个工程,也可以不写进 .bashrc,直接在当前终端执行完编译即可。用 cmake --version 验证版本和路径,确保 which cmake 指向的是新版本,而不是 /usr/bin/cmake 那个旧文件。软件包管理器安装的版本往往不是最新的,这一点在跨平台部署时尤其关键。
4. Windows 下快速实操:从下载安装到真正找到 exe
4.1 下载安装 CMake 时,这几个选项务必看清
CMake 官方下载页面分得很细,Windows 下直接选择 Windows x64 Installer 即可。安装过程大部分可以一路 Next,但有一个关键选项是“Add CMake to the system PATH for all users”。如果你漏掉了这个勾选,后面在命令行输 cmake 会提示不是内部或外部命令。
很多人安装完 CMake 后一直找不到原因,就是卡在 PATH 上。安装完记得重新开一个终端窗口,因为旧窗口不会自动刷新 PATH。执行:
bash复制cmake --version
能看到版本号,说明命令行调用已经通了。如果仍然提示找不到,可以手动把安装目录加进 PATH,例如 C:\Program Files\CMake\bin。这里要注意检查实际安装路径,不要照抄。
4.2 用命令行还是 CMake GUI,新手到底选哪种
CMake 自带一个图形界面 cmake-gui.exe。对完全没接触过构建流程的人,GUI 确实能让你看到源码目录、构建目录、生成器的选择项,点几下就能完成配置。但 GUI 的问题在于,它把很多细节“包装”掉了,出错信息看着不直观,也不方便复现。
我更推荐从命令行开始,至少把这几条命令记熟:
bash复制cmake -S . -B build
cmake --build build --config Release
第一条是配置阶段,第二条是编译阶段。配上 --config Release 是为了在 Visual Studio 这类多配置生成器上强制以 Release 方式编译。如果缺了这条,默认编译的是 Debug 版本,性能会比 Release 差不少。命令行报错信息完整,也方便谷歌和排查。等你把流程跑通以后,再用 VSCode 的 CMake Tools 或 Qt Creator 的图形界面,就会顺利得多。
4.3 VS 生成成功后 exe 到底在哪:为什么经常“找不到”
这是提问率超高的问题。本质原因是 Visual Studio 生成器是多配置生成器,它会把不同配置的输出放到不同子目录。假设你用:
bash复制cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
可执行文件不会出现在 build 根目录,而是在 build\Release\你的程序名.exe。如果你用 VS 打开 build\xxx.sln,在 IDE 里点“生成”,默认可能在 Debug 配置,产物就在 build\Debug\ 下。
排查思路很简单:先看你生成时用的配置,再看对应子目录。Windows 下也可以用文件资源管理器搜索 *.exe,但项目多了以后效率太低。养成“按配置找输出目录”的习惯,这个问题就不会再困扰你。
4.4 CMake 构建目录的几种错误用法,大多数人每天都在踩
我见过有人在源码目录里直接跑 cmake .,结果源码目录里到处生成 CMakeFiles、cmake_install.cmake 之类的中间文件,搞得整个项目乱七八糟。正确做法是单独建一个 build 目录,把生成物全部隔离出去。
还有一类坑是复用同一个 build 目录,今天用 VS 生成器,明天换 MinGW,后天又换编译器。CMake 会读取旧的 CMakeCache.txt,里面残留了之前生成器的路径设置,轻则警告,重则直接配置失败。最常见的解法就是删掉整个 build 目录重新配置,干净利落。
另外,build 目录一定不要提交到 Git。大多数 C++ 项目根目录的 .gitignore 里都会写 build/,你新建项目时应该也把这个规则加上。否则团队协作时,每个人都把自己的构建产物推上去,后续的合并冲突和磁盘浪费会让你烦躁到怀疑人生。
5. 高频报错排查实录(可直接检索对应段落)
5.1 “CMake 3.26 or higher is required. You are running version 2.8.12.2” 版本残留问题
这个报错字面意义已经很明确,CMakeLists.txt 要求的版本高于你当前运行版本。很多人奇怪“我刚装的 CMake 是新的,为什么运行的是 2.8.12.2”?这种场景八成是系统 PATH 里存在多个 CMake,旧版本路径排在了新版本前面。
Linux 下用:
bash复制which cmake
cmake --version
Windows 下用:
bash复制where cmake
cmake --version
确认当前用的是哪一个。如果输出路径指向 /usr/bin/cmake 或 C:\Program Files (x86)\CMake 这类旧目录,而真正的新版在别处,请调整 PATH 顺序,或者直接删除旧版本。不同发行版的 CMake 版本差异很大,CentOS 7 自带的 2.8 尤其容易踩雷,项目在 CI 机器上跑时也常常遇到旧版本问题。
5.2 main 函数链接不到 / undefined reference:先查目标还是先查库
“编译通过,但链接阶段出问题”是另一大类高频故障。常见症状包括 undefined reference to 'main',以及一堆符号找不到。前者通常表示你的 add_executable 里根本没有包含写有 main() 的那个源文件。比如:
cmake复制add_executable(app foo.cpp bar.cpp)
而 main() 在 main.cpp 里,没被加进来。编译自然通过了各个 .cpp,但链接时找不到程序入口。
后者的排查逻辑稍微复杂。我在自己的项目里养成了一套固定检查顺序:先去 CMakeLists.txt 里看要链接的目标列表,确认 target_link_libraries 是否写全;再检查函数名拼写,尤其是 C 库函数,如果头文件用 extern "C" 包住而实际没包,链接时就会因为名字改编规则不同而找不到符号;最后才去怀疑编译器或库的 ABI 不匹配。
5.3 “generator Visual Studio 1” 这类生成器错乱怎么处理
这个报错在 Flutter 构建 Windows 插件时比较常见,报错信息往往长这样:
text复制CMake Error at CMakeLists.txt:3 (project):
Generator Visual Studio 1 ... could not find any instance of Visual Studio
核心不是“1”这个数字神秘,而是 CMake 需要找一个可用的 Visual Studio 生成器,但系统里没有匹配的 VS 实例。原因基本就两类:没装 Visual Studio 的 C++ 桌面开发负载;或者 VS 装了但 CMake 版本太老,不认识新版 VS。
对策也很固定:先打开 Visual Studio Installer,确认已安装“使用 C++ 的桌面开发”;再到 VS 开发者命令行里跑 cmake -G "Visual Studio 17 2022" 试配;最后清理旧的构建目录重新配置。Flutter 场景下还可以跑 flutter doctor,观察 Visual Studio 工具链一栏是否打勾。
5.4 symbol lookup error:动态库版本不一致导致的“诡异”崩溃
在 Linux 上编译一个依赖 CMake 的程序或直接运行某个工具时,可能遇到这样的报错:
text复制symbol lookup error: /path/to/program: undefined symbol: _ZN4json...
这种问题的根源往往是运行时加载了错误的共享库版本。当时编译程序使用的头文件声明了某个符号,运行加载的动态库里却没有对应实现,或者符号名被不同编译器 name mangling 规则改得不一样。
排查时先确认程序加载的是哪个库,再看系统里是否同时存在多个版本。Linux 下可以用 ldd 查看二进制依赖的动态库路径。如果出现多个 CMake 或 jsoncpp 并存的状况,优先考虑统一升级系统库版本,或者直接改用官方提供的二进制版本。不要图省事把随机网站下载的库一股脑放进 /usr/lib,那会引发更多冲突。
5.5 no target architecture is known:交叉编译前期最常见的失误
做嵌入式或树莓派交叉编译时,CMake 可能直接中止并提示:
text复制No target architecture is known
这个报错多出在使用了自定义工具链文件但说明不完整的情况下。交叉编译时主机架构和目标机架构不同,CMake 无法像本机编译那样自动识别架构。它需要你在 toolchain 文件或命令行里明确以下几点:交叉编译器路径、目标系统名称(Linux 或 Generic)、目标处理器架构,以及该用哪些编译、链接标志。
我踩过几次坑之后养成的习惯是,在一个独立的 toolchain.cmake 里统一配置,不要散落在各个 CMakeLists 里。这个文件一般由 CMake 通过 -DCMAKE_TOOLCHAIN_FILE=... 指定。真正的交叉编译需要花心思,不是简单写个编译命令就能跑通的。
5.6 VSCode、Qt Creator、Flutter 各自跑 CMake 时的特别提示
同样一段 CMake 工程,在不同的 IDE 里会遇到不同的小脾气。
VSCode 搭配 CMake Tools 插件时,最常见的坑是插件不知道用哪个编译器,所以项目里要选好 Kit。命令面板输入 “CMake: Select a Kit”,选择已安装的 VS 工具链或 GCC。选好后插件会把完整的 CMake 命令自动运行,理论上你可以不用手敲命令,但真出了问题还是要回到命令行看完整日志。
Qt Creator 的 Kit 配置要同时检查三处:编译器、Qt 版本、CMake 版本。编译器来自 VS 工具链而不是 Qt 目录,这一点在前面已经细说。CMake 版本在 Qt Creator 的工具链配置页里也能单独指定,如果新版 Qt 要求更高的 CMake 版本,记得改到这个页签底下更新路径。
Flutter 场景相对特殊。构建 Android 原生代码时会用 NDK 自带的 CMake 和工具链,构建 Windows 桌面版时又回到 MSVC 路线。前者和本机 CMake 未必有关,后者则依赖 VS 工具链。所以遇到 Flutter 工程报生成器相关的 CMake 错误,先分清是 Android 还是 Windows 目标,再对症下药。
6. 把 CMake 用到日常开发:从一个工程管理多个算法练习说起
6.1 一个 CMake 工程管理 N 个算法练习,每个 main 自成 target
养成用 CMake 管理代码练习的习惯后,你就不用为每个小算法单开一个工程了。目录可以这样组织:
code复制algo/
├── CMakeLists.txt
├── sort/
│ ├── CMakeLists.txt
│ └── main.cpp
├── power/
│ ├── CMakeLists.txt
│ └── main.cpp
└── list/
├── CMakeLists.txt
└── main.cpp
顶层 CMakeLists.txt 只做一件事:
cmake复制cmake_minimum_required(VERSION 3.16)
project(AlgoPractice CXX)
add_subdirectory(sort)
add_subdirectory(power)
add_subdirectory(list)
每个子目录里的 CMakeLists.txt 各自负责自己的可执行文件,例如:
cmake复制add_executable(power main.cpp)
set_target_properties(power PROPERTIES CXX_STANDARD 17)
这样 cmake --build build 会一次性编译所有练习,你也可以只编译其中一个 target:
bash复制cmake --build build --target power
对正在准备面试算法题、刷“C++ 经典题”的人特别值得。写快速幂、链表操作、多维数组与指针这些练习时,不用为了每个题新建工程,全部归到一个项目里统一管理,编译测试都方便。
6.2 引入第三方库的正确姿势:OpenCV、MPI、Qt 都适用
算法练习写久了,下一步就是引入真正的第三方库。OpenCV 棋盘格标定、MPI 多进程开发这类需求,核心套路都一样:
cmake复制find_package(OpenCV REQUIRED)
find_package(MPI REQUIRED COMPONENTS CXX)
找到包后才能链接到 target:
cmake复制target_link_libraries(demo PRIVATE ${OpenCV_LIBS})
target_link_libraries(demo PRIVATE MPI::MPI_CXX)
Qt 6 也是类似的思路,但要配合 qt_standard_project_setup() 使用新的目标化写法。第三方库找不到时,CMake 给出的默认搜索范围有时不够,需要指定安装前缀:
bash复制cmake -S . -B build -DCMAKE_PREFIX_PATH=/path/to/OpenCV
很多“编译不过”的求助帖,最后都能归结为 find_package 没找到库。加 -DCMAKE_PREFIX_PATH 指向安装目录,是成本最低、见效最快的排查手段。
6.3 我长期用 CMake 养成的几个小习惯
压箱底的几个经验,不算什么高深技巧,但能明显提升效率。第一,源码目录永远保持干净,配置和构建产物一律放 build。即使是一个练手的小工程,我也坚持用 -S . -B build,而不是直接敲 cmake .。第二,遇到报错先看第一条,不要被最后长长的“red text”带走。CMake 报错信息确实长,但致命错误通常在第一行或前几行就写清楚了。第三,准备一份常用算法练习模板,把 C++ 标准、头文件组织、输出目录都配好,需要做题时只改 main.cpp 就够了。
这套玩法可能偏“个人化”,但我觉得它比反复手动敲命令行靠谱得多。毕竟构建工具的最终目的不是给你添堵,而是帮你把写代码之外的事情自动化掉,让你把精力留在 C++ 本身的逻辑里。
