gpt4 book ai didi

c++ - CMake make add_library 依赖于 ExternalProject_Add

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:17 27 4
gpt4 key购买 nike

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 文件的层次结构和组织进行任何更改?

谢谢!

最佳答案

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

set_source_files_properties(${Libsvm_SOURCE_FILES} PROPERTIES GENERATED TRUE)

关于c++ - CMake make add_library 依赖于 ExternalProject_Add,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47812230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com