CMake 使 add_library 依赖于 ExternalProject_Add

Posted

技术标签:

【中文标题】CMake 使 add_library 依赖于 ExternalProject_Add【英文标题】:CMake make add_library depend on ExternalProject_Add 【发布时间】:2017-12-14 11:27:24 【问题描述】:

TLDR:我想请 CMake 等待 ExternalProject_Add 完成,然后它会尝试移动到下一个子目录并构建一个恰好使用其中一个文件的库外部项目。换句话说,我喜欢将外部项目声明为共享库的依赖项。

更多说明:

假设我的 CMake 项目有两个目录:thirdpartysrc。我的***CMakeLists.txt 文件有:

add_subdirectory(thirdparty)
add_subdirectory(src)

thirdparty/CMakeLists.txt 包含多个ExternalProject_Add 命令。我的初衷是拉动和构建所有这些外部项目,然后继续在src 中构建我自己的库和可执行文件。不幸的是,这并没有按我的计划进行:

我的一个外部项目名为libsvm。我的src/CMakeLists.txt 有以下内容:

set(Libsvm_SOURCE_FILES
    $PROJECT_BINARY_DIR/thirdparty/libsvm/src/libsvm/svm.cpp
)

include_directories(
    $Libsvm_INCLUDE_DIR
)

add_library(
    mysvm
  SHARED
    $Libsvm_SOURCE_FILES
)

现在我面临的问题是 CMake 无法找到 $Libsvm_SOURCE_FILES,显然是因为这一步是在我的 thirdparty/CMakeLists.txt 文件中的 ExternalProject_Add 执行之前执行的。

我想将此外部项目声明为该库的依赖项。

更广泛的问题: 有没有一种干净的方法可以强制 CMake 在进入下一个子目录之前完成第一个子目录中的所有内容?如果没有,您是否建议我对 CMakeLists 文件的层次结构和组织进行任何更改?

谢谢!

【问题讨论】:

【参考方案1】:

CMake 期望传递给add_libraryadd_executable 的每个源文件都存在,除非它被标记为GENERATED。对于add_custom_command 列为OUTPUT 的文件自动 设置此属性。在其他情况下,需要显式设置此属性:

set_source_files_properties($Libsvm_SOURCE_FILES PROPERTIES GENERATED TRUE)

【讨论】:

以上是关于CMake 使 add_library 依赖于 ExternalProject_Add的主要内容,如果未能解决你的问题,请参考以下文章

CMake make 库需要 cxx 标准

cmake-buildsystem

CMake中add_library的使用

[cmake][转载]add_library详解

CMake同时生成静态库和动态库

add_library 在 CMake 中不能用于添加 CSharp 源文件?