我添加了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)
我的问题依次为:
注意:由于我尝试缩小问题范围并提供更多信息,因此对此问题进行了多次修改。
答案 0 :(得分:1)
(我很乐意在评论部分事先询问一些事情,但我的声誉太低,所以我只是试一试;)
我的嫌疑人很少,其中一个是子模块根${CMAKE_SOURCE_DIR}
的{{1}}。虽然单独运行CMakeLists.txt
时路径设置正确,但CMakeLists.txt
在您将其添加为子目录时会感到困惑。你有没有查看输出二进制文件的另一个目录?
首先我建议测试这个假设,然后我会建议为cmake
库编写类似的但是单独的CMakeLists.txt
文件,然后暂时将其替换为项目。不幸的是,xgboost
文件名是硬编码的,并且在一个目录中不可能有两个这样的文件;所以似乎 1)的答案是,你宁愿改变文件。
对于 2):只要在CMakeLists.txt
中不需要大量额外逻辑,就有意义了。其他可行的选择是创建CMakeLists.txt
目标,您可以使用该目标在本地安装install
库(使用xgboost
(doc)变量),然后添加安装CMAKE_INSTALL_PREFIX
(doc)的路径。