CMake新手遇到add_subdirectory(source)指定目录不存在报错如何解决
CMake 报错 "add_subdirectory given source 'source' which is not an existing directory" 解决方案
核心错误原因
报错的直接触发逻辑是:CMake 执行add_subdirectory(source)时,在当前工作目录下找不到名为source的子目录,结合你给出的执行步骤,具体有两个错误点:
- 目录结构不匹配:存放顶层CMakeLists.txt的源码根目录下,没有
source子目录,或是source子目录中没有对应的CMakeLists.txt配置文件 - 执行路径错误:你进入了
~/build构建目录后执行cmake .,相当于把构建目录当成了源码根目录,CMake只会在~/build下查找source目录,自然匹配失败。同时你写的CMAKE_FLAGS环境变量是无效配置,CMake不会识别该变量传入的参数。
修复步骤
- 第一步:调整目录结构,确保符合以下层级:
<源码根目录,例如路径为 ~/hello_project> ├── CMakeLists.txt (你贴出的顶层配置文件) └── source └── CMakeLists.txt (源码目录下的CMake配置文件,用来声明编译目标、源文件等逻辑)
如果你的源码存放在其他命名的目录下,直接把add_subdirectory(source)中的source改成你实际的源码目录名即可。
- 第二步:执行正确的CMake分离构建命令:
# 进入构建目录 cd ~/build # cmake 末尾参数指向顶层CMakeLists.txt所在的源码根目录,直接传入配置参数 cmake ~/hello_project -DTARGET_ONE=ON -DCMAKE_BUILD_TYPE=Release # 启动编译 cmake --build .
如果不需要分离构建,也可以直接在源码根目录执行编译,缺点是编译产物会和源码文件混放,清理不便:
cd ~/hello_project cmake . -DTARGET_ONE=ON -DCMAKE_BUILD_TYPE=Release cmake --build .
- 补充:如果项目不需要分子目录管理,可直接删除
add_subdirectory(source)配置,在顶层CMakeLists.txt中直接声明编译目标即可,示例:
# 声明可执行文件编译目标,hello为输出文件名,后面跟所有需要编译的源文件 add_executable(hello main.cpp)
内容的提问来源于stack exchange,提问作者Debdutta Halder
相关产品推荐
相关产品推荐

