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
依赖于 library2
和 library1
library2
依赖于library1
在library3
CMakeLists.txt
cmake_minimum_required (VERSION 3.9)
add_subdirectory(../library2 $CMAKE_CURRENT_SOURCE/../library2/build)
add_subdirectory(../library1 $CMAKE_CURRENT_SOURCE/../library1/build)
在library2
CMakeLists.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_executable
和 target_link_libraries
调用之后(如果适用)添加:
add_dependencies(library3 general path/to/library2 general path/to/library1
举个例子。
【讨论】:
以上是关于CMake如何避免递归add_subdirectory?的主要内容,如果未能解决你的问题,请参考以下文章
CMake:如何避免 HDF5 系统和 conda 安装中的不匹配?
CMake 为 VS 项目生成循环依赖,但不生成文件。如何避免?