【发布时间】:2017-10-26 22:24:58
【问题描述】:
我将xgboost 库添加为我的项目的 git 子模块,我正在尝试将它作为子目录添加到 cmake。不幸的是,它不起作用。带有以下 CMakeLists.txt 的简单 hello world 项目复制了我遇到的错误。
cmake_minimum_required(VERSION 3.2)
project(foo)
add_subdirectory(xgboost)
add_executable(${PROJECT_NAME} foo.cpp)
target_link_libraries(${PROJECT_NAME} xgboost)
构建库后,xgboost/lib 目录中没有任何内容,因此出现以下错误。
clang: error: no such file or directory:
'/Users/.../myproject/xgboost/lib/libxgboost.dylib'
我认为问题是在他们的 CMakeLists 文件中产生的,因为他们有两个不同的目标。也许 cmake 选择了错误的目标,但我对 cmake 还不够熟悉,无法弄清楚。以下代码来自 xgboost 的 CMakeLists。
# Executable
add_executable(runxgboost $<TARGET_OBJECTS:objxgboost> src/cli_main.cc)
set_target_properties(runxgboost PROPERTIES
OUTPUT_NAME xgboost
)
set_output_directory(runxgboost ${PROJECT_SOURCE_DIR})
target_link_libraries(runxgboost ${LINK_LIBRARIES})
# Shared library
add_library(xgboost SHARED $<TARGET_OBJECTS:objxgboost>)
target_link_libraries(xgboost ${LINK_LIBRARIES})
set_output_directory(xgboost ${PROJECT_SOURCE_DIR}/lib)
#Ensure these two targets do not build simultaneously, as they produce outputs with conflicting names
add_dependencies(xgboost runxgboost)
我的问题按重要性排序是:
- 有什么方法可以在不修改xgboost的CMakeLists.txt文件的情况下修复它?
- 尝试将 xgboost 作为 git 子模块添加到我的项目中是否合理?
- cmake 没有指示构建库是否有任何原因?
注意:由于我试图缩小问题范围并提供更多信息,因此对该问题进行了多次修改。
【问题讨论】:
-
如果您认为问题缺少我的 CMakeLists 文件的相关部分,请告诉我,我会添加它们。
-
很奇怪,当您将 target 与
target_link_libraries一起使用时,CMake 应该在任何位置找到库文件。您能否提供有关找不到库的确切错误消息。 -
@Tsyvarev 我将错误添加到问题中。
-
您是否尝试过独立构建
xgboost项目?如果这不起作用,那么项目本身的问题。否则,集成到您的项目中会出现问题,而xgboost似乎 已准备好进行此类集成。可能是您的项目的某些代码用创建的库覆盖了目录。在调试问题时,您可能会检测到CMakeLists.txt中的分支,该分支是通过在其中添加message()调用来执行的。据我所知,最好使用add_subdirectory (xgboost)。 -
@Tsyvarev 我做了一个非常简单的项目,但我仍然遇到同样的问题。我还把它改成了
add_subdirectory (xgboost)。谢谢你的建议。您可以在更新后的问题中查看。