【发布时间】:2018-01-12 22:44:34
【问题描述】:
我正在尝试使用 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 不允许导出不存在的包含目录。
是否有任何其他方法可以使所有依赖于 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.
【问题讨论】:
-
Presize 错误信息,请。
-
IMPORTED_LINK_INTERFACE_LIBRARIES顺便说一句已被弃用。使用INTERFACE_LINK_LIBRARIES。您是否考虑过在 ExternalProject CMakeLists.txt 上使用execute_process()调用cmake(两次),那么您将在配置时拥有可用的依赖项?或者,您可以在 CMakeLists.txt 配置期间伪造仅依赖目录的创建。 -
这是我的 B 计划,但仍然想知道是否有好的做法
-
我遇到了同样的问题。运气好吗?
-
@mchiasson 我已添加完整的 CMakeLists.txt,希望对您有所帮助
标签: cmake