核心是让add_executable明确“看见”源文件路径:路径必须相对于CMAKE_CURRENT_SOURCE_DIR,头文件需通过include_directories或target_include_directories指定,多目录项目须用add_subdirectory分层管理并正确声明依赖。

Windows 下 CMake 添加源文件,核心就一条:让 add_executable 或 add_library 指令“看见”你要编译的 .cpp/.c 文件。不是把文件丢进目录就行,CMake 不自动扫描——它只认你明确告诉它的路径。
直接在 add_executable 里列全路径最稳妥
这是新手最不容易出错的方式,尤其适合文件少、结构扁平的项目(比如 src/main.cpp + src/utils.cpp)。
-
add_executable(hello src/main.cpp src/utils.cpp)—— 路径是相对于CMakeLists.txt所在目录的,别写成./src/...或绝对路径 - 头文件(
.h)不用列进来,但必须确保include_directories()或target_include_directories()指向了头文件所在目录 - 如果路径写错(比如漏掉
src/前缀),CMake configure 阶段会报错:File does not exist
用 aux_source_directory 自动收集,但有坑
这个函数常被教程推荐,但它只做“递归查找 .cpp/.c/.cc”,不处理子目录嵌套、不识别头文件依赖、也不保证编译顺序——容易漏文件或引入无关文件。
-
aux_source_directory(src SRC_LIST)→ 把src/下所有源文件塞进变量SRC_LIST - 接着用
add_executable(hello ${SRC_LIST})—— 注意必须带${},否则 CMake 当成字面量字符串 - 问题:如果
src/里混着测试文件(test_main.cpp)或旧版本(utils_old.cpp),它也会被加进去 - 更糟的是:它不处理
src/utils/utils.cpp这种二级子目录,除非你写aux_source_directory(src/utils ...)
多目录项目必须用 add_subdirectory 分层管理
当你有 src/main/、src/utils/、src/network/ 这类结构时,硬塞进一个 add_executable 就乱了。正确做法是每个子目录放自己的 CMakeLists.txt,根目录用 add_subdirectory 组装。
- 根目录
CMakeLists.txt只写:add_subdirectory(src/main)、add_subdirectory(src/utils) -
src/utils/CMakeLists.txt里定义库:add_library(utils utils.cpp),再用target_include_directories(utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -
src/main/CMakeLists.txt里链接:target_link_libraries(hello PRIVATE utils) - 漏掉
target_include_directories或target_link_libraries,编译时会报undefined reference to 'add'或utils.h: No such file or directory
真正麻烦的从来不是“怎么加”,而是加完之后头文件路径没配对、依赖没声明、或者跨目录引用时用了相对路径却忘了 target_include_directories 的 PUBLIC/PRIVATE 作用域——这些错误不会在 configure 阶段暴露,要到 build 阶段才炸。


















