CMake命令行运行需确保项目根目录存在严格命名的CMakeLists.txt;add_executable用于可执行文件,add_library按STATIC/SHARED/INTERFACE指定库类型;find_package找不到Boost需设置CMAKE_PREFIX_PATH或BOOST_ROOT;头文件不触发重编译因未显式列举源文件或未正确声明include路径。

cmake 命令行怎么跑起来,不报 CMakeLists.txt not found
根本问题不是“怎么写 CMake”,而是项目根目录里缺了 CMakeLists.txt —— 它必须存在,且名字大小写严格匹配(Linux 下 cmlists.txt 或 Cmakelists.txt 都不行)。
常见错误现象:在子目录里执行 cmake .,或者把 CMakeLists.txt 放进了 src/ 但你在项目根目录外运行命令。
实操建议:
• 进入项目最外层目录(即你打算生成构建文件的地方)
• 确认该目录下有且仅有一个 CMakeLists.txt
• 运行 cmake -S . -B build(推荐),或旧式写法 cmake .(但不建议在源码目录内生成,易污染)
• 若用 -B build,后续所有构建命令(如 cmake --build build)都得指向这个 build 目录
add_executable 和 add_library 怎么选对目标类型
选错会导致链接失败或符号找不到,比如把主程序写成 add_library(myapp ...),结果 main() 不被入口识别。
使用场景很直接:
• 可执行文件(带 main 函数)→ 用 add_executable
• 封装功能、供其他模块调用 → 用 add_library,并明确指定类型:
– add_library(mylib STATIC ...)(静态库,.a/.lib)
– add_library(mylib SHARED ...)(动态库,.so/.dll)
– add_library(mylib INTERFACE ...)(纯头文件库,只传编译选项)
参数差异重点在依赖传递:INTERFACE 库的 target_include_directories(... INTERFACE ...) 会自动透传给链接它的目标;而 STATIC 默认不透传,得手动加 PUBLIC
为什么 find_package(Boost) 找不到,但系统明明装了 boost
根本原因不是“没装”,而是 CMake 不知道去哪里找——它默认只查系统级路径(如 /usr/lib/cmake/Boost),而 Homebrew/macOS 或自己编译安装的 Boost 往往在非标准位置。
容易踩的坑:
• 没设 CMAKE_PREFIX_PATH,比如 Homebrew 的 Boost 在 /opt/homebrew,就得加 -DCMAKE_PREFIX_PATH=/opt/homebrew
• 用了 find_package(Boost REQUIRED) 却没声明组件,比如要 filesystem,得写 find_package(Boost REQUIRED COMPONENTS filesystem),否则即使找到 Boost,也会因组件缺失报错
• Linux 上用包管理器装的 Boost(如 apt install libboost-filesystem-dev)通常自带 CMake config,但 macOS 的 brew install boost 默认不生成 BoostConfig.cmake,得靠 find_package(Boost ...) 的兼容模式,此时更依赖 BOOST_ROOT 环境变量
生成的 Makefile 为什么不重新编译改过的 .h 文件
CMake 本身能自动处理头文件依赖,但前提是:你声明的源文件列表里包含了所有实际参与编译的 .cpp,且这些 .cpp 里 #include 的头文件路径是 CMake 能解析到的。
性能影响明显:漏掉依赖会导致修改头文件后不触发重编,产生静默错误。
实操要点:
• 不要用通配符(如 file(GLOB ...))收集源文件,CMake 无法据此推导头依赖,改了 .h 后不会清缓存重扫
• 所有 add_executable / add_library 的源文件列表必须显式列出每个 .cpp
• 如果头文件在非标准路径(如 include/),务必用 target_include_directories(mytarget PUBLIC include),否则 CMake 解析 #include "xxx.h" 时会跳过该路径,导致依赖链断裂
立即学习“C++免费学习笔记(深入)”;
头文件路径声明和源文件显式列举这两件事,看着琐碎,却是 CMake 增量构建可靠的唯一基础。漏一个,就可能让后续调试变成猜谜。











