CMake 错误:“add_subdirectory 未给出二进制目录”

Posted

技术标签:

【中文标题】CMake 错误:“add_subdirectory 未给出二进制目录”【英文标题】:CMake Error: "add_subdirectory not given a binary directory" 【发布时间】:2018-10-28 17:01:10 【问题描述】:

我正在尝试将 Google Test 集成到更大项目的子项目中,但我找不到令我满意的解决方案。

我有两个限制:

Google Test 的源代码已经在项目结构中的某个位置(因此不能使用 URL 从 git 存储库下载它) Google Test 的源代码不是我的子项目的子目录(永远不会)

所以当我尝试做这样的事情时:

add_subdirectory( $GOOGLETEST_PROJECT_LOCATION)

我收到了:

CMake Error at unit_tests/CMakeLists.txt:10 (add_subdirectory):
  add_subdirectory not given a binary directory but the given source
  directory "$GOOGLETEST_PROJECT_LOCATION" is not a subdirectory of
  "$UNIT_TEST_DIRECTORY".  When
  specifying an out-of-tree source a binary directory must be explicitly
  specified.

另一方面,ExternalProject_Add 可能是一个解决方案,但当我根本不想下载源代码并使用项目中特定位置的源代码时,我不知道该如何使用它。

项目结构看起来更像这样:

3rdparty 
    |--googletest 
...
subproject
   |--module1
      |--file1.cpp
      |--CMakeLists.txt
   |--module2
      |--file2.cpp
      |--CMakeLists.txt
   |--include
      |--module1
          |--file1.h
      |--module2
          |--file2.h
   |--unit_test
       |--module1
           |--file1test.cpp
       |--module2
           |--file2test.cpp
       |--CMakeLists.txt
   |--CMakeLists.txt
CMakeLists.txt

【问题讨论】:

【参考方案1】:

错误消息很清楚 - 您还应该为 googletest 指定 构建目录

# This will build googletest under build/ subdirectory in the project's build tree
add_subdirectory( $GOOGLETEST_PROJECT_LOCATION build)

当您将 relative 路径(作为 source 目录)提供给 add_subdirectory 调用时,CMake 会自动为 build使用相同的相对路径> 目录。

但是在绝对源路径的情况下(并且当这个路径不在你的源代码树中时),CMake无法猜测build目录,你需要提供它明确

对于add_subdirectory 命令,另请参见documentation。

【讨论】:

../Lib1 对 CMake 来说是绝对的吗?因为拥有这种相对路径也会产生这个错误。我认为相对路径可以不包含 bin 目录! 在我的回答帖子中,源路径还有另一个条件 - “当此路径不在您的源树中时” - 当 CMake 需要明确指定构建目录时。也就是说,如果您从 top CMakeLists.txt 调用 add_subdirectory(../Lib1),CMake 将发出有关“未给出二进制目录”的错误。另请注意,应避免在***构建目录之外使用构建目录。【参考方案2】:

我觉得有义务对此发表评论,因为这是我在谷歌上搜索此错误时的热门搜索结果。

对我来说,我显然是个白痴:我已经修改了我项目的 src 目录中的 CMakeLists.txt 文件,但我没有意识到该文件已被锁定并且 VS Code 甚至没有实际保存当我按下 Ctrl+S 时。检查 VS Code 中的文件选项卡,看看那里是否有一个白点,表示文件未保存。按 Ctrl+S 并查看右下角是否有弹出窗口提示您以超级用户身份重试。

我仍然有错误,但它们是对我的项目有意义的新错误。

【讨论】:

以上是关于CMake 错误:“add_subdirectory 未给出二进制目录”的主要内容,如果未能解决你的问题,请参考以下文章

“CMake 错误:CMake 无法确定目标的链接器语言” 当我 catkin_make ROS 工作空间时出现错误

CMake错误配置opencv

CMake 错误:CMake 无法找到与“Unix Makefiles”对应的构建程序。 CMAKE_MAKE_PROGRAM 未设置

[Tools] [cmake] 调试笔记 --- cmake缓存引起的一个错误

cocos2d/cmake/Modules/CocosConfigDepend.cmake:94 (endmacro) 的 CMake 错误:流控制语句未正确嵌套

CMake 路径中的错误