C++ CMake使添加库依赖于外部项目添加

C++ CMake使添加库依赖于外部项目添加,c++,build,cmake,C++,Build,Cmake,TLDR:我想让CMake等待ExternalProject\u Add完成,然后再尝试移动到下一个子目录并构建一个库,该库恰好使用外部项目的一个文件。换句话说,我喜欢将外部项目声明为共享库的依赖项 更多说明: 假设我的CMake项目有两个目录:thirdparty和src。我的顶级CMakeLists.txt文件包含: add_subdirectory(thirdparty) add_subdirectory(src) thirdparty/CMakeLists.txt包含多个Externa

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

更多说明:

假设我的CMake项目有两个目录:
thirdparty
src
。我的顶级
CMakeLists.txt
文件包含:

add_subdirectory(thirdparty)
add_subdirectory(src)
thirdparty/CMakeLists.txt
包含多个
ExternalProject\u 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在进入下一个子目录之前完成第一个子目录中的所有内容?如果没有,您是否建议我对CmakeList文件的层次结构和组织进行任何更改


谢谢

CMake希望传递到
add\u library
add\u executable
的每个源文件都存在,除非它被标记为。对于列为
add\u custom\u命令
输出的文件,会自动设置此属性。在其他情况下,需要显式设置此属性:

set_source_files_properties(${Libsvm_SOURCE_FILES} PROPERTIES GENERATED TRUE)