CMake如何避免递归add_subdirectory?

Posted

技术标签:

【中文标题】CMake如何避免递归add_subdirectory?【英文标题】:CMake how to avoid recursive add_subdirectory? 【发布时间】:2017-12-20 18:43:40 【问题描述】:

我的工作区结构如下

workspace
  library1
  library2
  library3

library3 依赖于 library2library1

library2 依赖于library1

library3CMakeLists.txt

cmake_minimum_required (VERSION 3.9)
add_subdirectory(../library2 $CMAKE_CURRENT_SOURCE/../library2/build)
add_subdirectory(../library1 $CMAKE_CURRENT_SOURCE/../library1/build)

library2CMakeLists.txt

cmake_minimum_required (VERSION 3.9)
add_subdirectory(../library1 $CMAKE_CURRENT_SOURCE/../library1/build)

library2 中的 cmake 抛出 library1/build 已经包含 cmake 文件的错误。

CMake Error at C:/Users/me/workspace/Library2/CMakeLists.txt:12 (add_subdirectory):
  The binary directory

    C:/Users/me/workspace/Library1/build

  is already used to build a source directory.  It cannot be used to build
  source directory

    C:/Users/me/workspace/Library1

  Specify a unique binary directory name.

【问题讨论】:

How to handle a transitive dependency conflict using Git submodules and CMake?的可能重复 构建目录冲突只是add_subdirectory() 与相同源目录的第一个问题。即使你克服了它,你也会面临双重目标的定义。参考问题描述了如何避免后一个问题,它将有助于避免前一个问题。 CMake: How to setup Source, Library and CMakeLists.txt dependencies?的可能重复 【参考方案1】:

我个人会为这样的事情做的是,在workspace,我有一个设置项目的根 CMakeList.txt 文件:

# Set the minimum version of cmake required
cmake_minimum_required(VERSION 3.9)
project(MyProject)
add_subdirectory(library1)
add_subdirectory(library2)
add_subdirectory(library3)

(这就是你所需要的,你的根 CMakeLists.txt 文件根本不需要很长)。

然后不调用相对路径add_subdirectory()调用,那么对于需要依赖的库,使用add_dependencies(<target> \[<target-dependency>\]...)保证依赖目标在当前目标之前构建。

所以在 library3/CMakeLists.txt 中,在您的 add_library/add_executabletarget_link_libraries 调用之后(如果适用)添加:

add_dependencies(library3 general path/to/library2 general path/to/library1

举个例子。

【讨论】:

以上是关于CMake如何避免递归add_subdirectory?的主要内容,如果未能解决你的问题,请参考以下文章

CMake:如何避免 HDF5 系统和 conda 安装中的不匹配?

如何避免在 cmake 中自动链接 Qt5 库?

CMake 为 VS 项目生成循环依赖,但不生成文件。如何避免?

CMake / Ninja:当内容未知时递归“清理”输出目录......?

如何避免在递归中使用全局/类级别变量?

数据绑定如何避免 WPF 中的递归更新?