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