链接到 CMAKE 中的 ExternalProject_add 依赖项
Linking against an ExternalProject_add dependency in CMAKE
我在 运行 Ninja 时遇到以下 ninja 构建错误。我的 CMAKE 构建命令是 cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release
.
ninja: error: 'ext_deps/api/src/ext_api/build/src/lib/libapi.a', needed by 'Project', missing and no known rule to make it
假设我的项目包含 API(通过 CMAKE 从 GitHub 下载)和实现(项目)。
The layout would look like:
Project/
-- build/
-- cmake/modules
----- ExternalDep.cmake
----- FindAPI.cmake
-- CMakeLists.txt
-- src/
---- CMakeLists.txt
-- include/
假设在顶层 CMakeLists.txt
我执行设置构建设置、CXX 标志等的常规业务,然后我调用 include(ExternalDep)
,检查 "API" 库在用户系统中(如果不存在,则通过 CMAKE 下载)。
在 src/CMakeLists.txt
中,我尝试 link 使用
来对抗 API 库
target_link_libraries(${PROJECT_NAME} PRIVATE ${API_LIBRARY})
我遇到的第一个问题是,在 "API" 库甚至可以下载和构建之前,我收到了上面发布的忍者构建错误。在我尝试添加 Project 可执行文件和针对 "API" 库的 link 之前,我肯定包含 ExternalDep.cmake
。
这是ExternalDep.cmake
的简化版本:
set(EXT_DEPS_PREFIX "ext_deps")
ExternalProject_Add(ext_lib
GIT_REPOSITORY "https://github.com/fake/api.git"
GIT_TAG "master"
PREFIX "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api"
TMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-tmp"
STAMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-stamp"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
SOURCE_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api"
BINARY_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build"
BUILD_ALWAYS true
TEST_COMMAND "")
add_dependencies(ext_projects ext_api)
set(API_LIBRARY "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build/src/lib/libapi.a")
我能够通过生成 Unix Makefile 而不是 Ninja 来解决这个问题。我仍然不确定这是否是单一问题,但它绝对是其中一个问题。
我 运行 遇到了与 Ninja
相同的问题,而它与 Unix Makefiles
一起工作正常,我设法通过添加 Ninja
使其与 Ninja
一起工作=14=] 行到我的 ExternalProject_Add
块。示例:
ExternalProject_Add(SDL2_PROJECT
PREFIX 3rdparty
URL https://www.libsdl.org/release/SDL2-2.0.5.tar.gz
URL_MD5 d4055424d556b4a908aa76fad63abd3c
CONFIGURE_COMMAND <SOURCE_DIR>/configure ${SDL2_configure_args} --prefix=<INSTALL_DIR> --disable-shared
INSTALL_COMMAND make install -j9
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libSDL2.a
)
ExternalProject_Get_Property(SDL2_PROJECT INSTALL_DIR)
set(SDL2_INSTALL_DIR ${INSTALL_DIR})
add_library(SDL2_LIBRARY STATIC IMPORTED GLOBAL)
set_property(TARGET SDL2_LIBRARY PROPERTY IMPORTED_LOCATION ${SDL2_INSTALL_DIR}/lib/libSDL2.a)
add_dependencies(SDL2_LIBRARY SDL2_PROJECT)
我在 运行 Ninja 时遇到以下 ninja 构建错误。我的 CMAKE 构建命令是 cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release
.
ninja: error: 'ext_deps/api/src/ext_api/build/src/lib/libapi.a', needed by 'Project', missing and no known rule to make it
假设我的项目包含 API(通过 CMAKE 从 GitHub 下载)和实现(项目)。
The layout would look like:
Project/
-- build/
-- cmake/modules
----- ExternalDep.cmake
----- FindAPI.cmake
-- CMakeLists.txt
-- src/
---- CMakeLists.txt
-- include/
假设在顶层 CMakeLists.txt
我执行设置构建设置、CXX 标志等的常规业务,然后我调用 include(ExternalDep)
,检查 "API" 库在用户系统中(如果不存在,则通过 CMAKE 下载)。
在 src/CMakeLists.txt
中,我尝试 link 使用
target_link_libraries(${PROJECT_NAME} PRIVATE ${API_LIBRARY})
我遇到的第一个问题是,在 "API" 库甚至可以下载和构建之前,我收到了上面发布的忍者构建错误。在我尝试添加 Project 可执行文件和针对 "API" 库的 link 之前,我肯定包含 ExternalDep.cmake
。
这是ExternalDep.cmake
的简化版本:
set(EXT_DEPS_PREFIX "ext_deps")
ExternalProject_Add(ext_lib
GIT_REPOSITORY "https://github.com/fake/api.git"
GIT_TAG "master"
PREFIX "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api"
TMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-tmp"
STAMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-stamp"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
SOURCE_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api"
BINARY_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build"
BUILD_ALWAYS true
TEST_COMMAND "")
add_dependencies(ext_projects ext_api)
set(API_LIBRARY "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build/src/lib/libapi.a")
我能够通过生成 Unix Makefile 而不是 Ninja 来解决这个问题。我仍然不确定这是否是单一问题,但它绝对是其中一个问题。
我 运行 遇到了与 Ninja
相同的问题,而它与 Unix Makefiles
一起工作正常,我设法通过添加 Ninja
使其与 Ninja
一起工作=14=] 行到我的 ExternalProject_Add
块。示例:
ExternalProject_Add(SDL2_PROJECT
PREFIX 3rdparty
URL https://www.libsdl.org/release/SDL2-2.0.5.tar.gz
URL_MD5 d4055424d556b4a908aa76fad63abd3c
CONFIGURE_COMMAND <SOURCE_DIR>/configure ${SDL2_configure_args} --prefix=<INSTALL_DIR> --disable-shared
INSTALL_COMMAND make install -j9
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libSDL2.a
)
ExternalProject_Get_Property(SDL2_PROJECT INSTALL_DIR)
set(SDL2_INSTALL_DIR ${INSTALL_DIR})
add_library(SDL2_LIBRARY STATIC IMPORTED GLOBAL)
set_property(TARGET SDL2_LIBRARY PROPERTY IMPORTED_LOCATION ${SDL2_INSTALL_DIR}/lib/libSDL2.a)
add_dependencies(SDL2_LIBRARY SDL2_PROJECT)