我试图使用ExternalProject_Add将外部项目作为库添加到我的项目中:
ExternalProject_Add(
xgboost
GIT_REPOSITORY https://github.com/dmlc/xgboost.git
GIT_TAG v0.60
PREFIX ${CMAKE_CURRENT_BINARY_DIR}
INSTALL_COMMAND ""
)
此外,我还定义了库目标,并将外部项目添加为依赖项:
set(XGBOOST_PREFIX_PATH "${CMAKE_CURRENT_BINARY_DIR}/src")
set(XGBOOST_BINARY_PATH "${XGBOOST_PREFIX_PATH}/xgboost-build")
set(XGBOOST_BINARY_INCLUDE "${XGBOOST_PREFIX_PATH}/xgboost/include;${XGBOOST_PREFIX_PATH}/xgboost/dmlc-core/include;${XGBOOST_PREFIX_PATH}/xgboost/rabit/include")
add_library(libxgboost IMPORTED STATIC GLOBAL)
add_dependencies(libxgboost xgboost)
set_target_properties(libxgboost PROPERTIES
"IMPORTED_LOCATION" "${XGBOOST_BINARY_PATH}/liblibxgboost.dylib"
"IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}"
"INTERFACE_INCLUDE_DIRECTORIES" "${XGBOOST_BINARY_INCLUDE}"
)
在另一个CMakeLists.txt中:
add_library(somelib STATIC SomeLib.cpp)
target_include_directories(somelib PUBLIC libxgboost)
target_link_libraries(somelib libxgboost)
问题是cmake INTERFACE_INCLUDE_DIRECTORIES不允许导出包含dir的不存在的dir。
是否有其他方法使所有依赖libxgboost的目标自动包含头文件?
更新:
错误消息:
CMake Error in somelib/CMakeLists.txt:
Imported target "libxgboost" includes non-existent path
"build/xgboost/src/xgboost/include"
in its INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include:
* The path was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and references files it does not
provide.
发布于 2021-03-17 10:23:50
请注意,可以将FetchContent
和ExternalProject_Add
结合起来,以实现以下目标:
FetchContent
将使源代码在配置时可用,从而绕过INTERFACE_INCLUDE_DIRECTORIES
不存在的问题。ExternalProject_Add
将使用FetchContent
下载的源代码在构建时进行构建。下面是构建libpqxx
的示例
include(FetchContent)
include(ExternalProject)
find_package(PostgreSQL)
# Using FetchContent means we will download libpqxx at configure-time
FetchContent_Declare(libpqxx_ext
GIT_REPOSITORY
https://github.com/jtv/libpqxx
GIT_TAG
tags/7.4.1
)
FetchContent_GetProperties(libpqxx_ext)
if(NOT libpqxx_ext_POPULATED)
FetchContent_Populate(libpqxx_ext)
endif()
set(LIB_PQXX_SRC_DIR ${CMAKE_BINARY_DIR}/_deps/libpqxx_ext-src)
# Build libpqxx
ExternalProject_Add(libpqxx_ext
SOURCE_DIR
${libpqxx_ext_SOURCE_DIR}
PREFIX
ext
BINARY_DIR
build
CMAKE_ARGS
-DSKIP_BUILD_TEST=on
INSTALL_COMMAND
""
BUILD_ALWAYS
OFF
)
set(LIB_PQXX_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/src)
# Make the libpxqq artifacts available to our project
add_library(libpqxx STATIC IMPORTED GLOBAL)
set_target_properties(libpqxx
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES
${LIB_PQXX_SRC_DIR}/include
IMPORTED_LOCATION
${LIB_PQXX_BUILD_DIR}/libpqxx.a
INTERFACE_LINK_LIBRARIES
${PostgreSQL_LIBRARIES})
add_dependencies(libpqxx libpqxx_ext)
https://stackoverflow.com/questions/45516209
复制相似问题