CMake如何避免递归add_subdirectory?

问题描述 投票:1回答:1

我的工作空间结构为

workspace
  library1
  library2
  library3

library3依赖于library2library1

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.
cmake
1个回答
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

举个例子。

© www.soinside.com 2019 - 2024. All rights reserved.