在作为子目录添加时,不要构建库

时间:2017-10-24 15:44:14

标签: c++ git cmake xgboost

我添加了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)

我的问题依次为:

  1. 有没有办法在不修改xgboost的CMakeLists.txt文件的情况下修复它?
  2. 尝试将xgboost作为git子模块添加到我的项目中是否合理?
  3. 有没有理由cmake没有指示建立图书馆?
  4. 注意:由于我尝试缩小问题范围并提供更多信息,因此对此问题进行了多次修改。

1 个答案:

答案 0 :(得分:1)

(我很乐意在评论部分事先询问一些事情,但我的声誉太低,所以我只是试一试;)

我的嫌疑人很少,其中一个是子模块根${CMAKE_SOURCE_DIR}的{​​{1}}。虽然单独运行CMakeLists.txt时路径设置正确,但CMakeLists.txt在您将其添加为子目录时会感到困惑。你有没有查看输出二进制文件的另一个目录?

首先我建议测试这个假设,然后我会建议为cmake库编写类似的但是单独的CMakeLists.txt文件,然后暂时将其替换为项目。不幸的是,xgboost文件名是硬编码的,并且在一个目录中不可能有两个这样的文件;所以似乎 1)的答案是,你宁愿改变文件。

对于 2):只要在CMakeLists.txt中不需要大量额外逻辑,就有意义了。其他可行的选择是创建CMakeLists.txt目标,您可以使用该目标在本地安装install库(使用xgboostdoc)变量),然后添加安装CMAKE_INSTALL_PREFIXdoc)的路径。