【问题标题】:CMake not building a library when added as a subdirectory添加为子目录时,CMake 不构建库
【发布时间】: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)

我的问题按重要性排序是:

  1. 有什么方法可以在不修改xgboost的CMakeLists.txt文件的情况下修复它?
  2. 尝试将 xgboost 作为 git 子模块添加到我的项目中是否合理?
  3. cmake 没有指示构建库是否有任何原因?

注意:由于我试图缩小问题范围并提供更多信息,因此对该问题进行了多次修改。

【问题讨论】:

  • 如果您认为问题缺少我的 CMakeLists 文件的相关部分,请告诉我,我会添加它们。
  • 很奇怪,当您将 targettarget_link_libraries 一起使用时,CMake 应该在任何位置找到库文件。您能否提供有关找不到库的确切错误消息。
  • @Tsyvarev 我将错误添加到问题中。
  • 您是否尝试过独立构建xgboost 项目?如果这不起作用,那么项目本身的问题。否则,集成到您的项目中会出现问题,而 xgboost 似乎 已准备好进行此类集成。可能是您的项目的某些代码用创建的库覆盖了目录。在调试问题时,您可能会检测到CMakeLists.txt 中的分支,该分支是通过在其中添加message() 调用来执行的。据我所知,最好使用add_subdirectory (xgboost)
  • @Tsyvarev 我做了一个非常简单的项目,但我仍然遇到同样的问题。我还把它改成了add_subdirectory (xgboost)。谢谢你的建议。您可以在更新后的问题中查看。

标签: c++ git cmake xgboost


【解决方案1】:

(我很想在评论部分事先询问一些事情,但我的声誉太低了,所以我会试一试;))

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

首先我建议测试这个假设,然后我建议为xgboost 库编写类似但单独的CMakeLists.txt 文件,然后在项目中临时替换它。不幸的是,CMakeLists.txt 文件名是硬编码的,不可能在一个目录中有两个此类文件;所以看来 1) 的答案是,你宁愿更改文件。

对于 2):只要它不需要在您的 CMakeLists.txt 中添加大量额外的逻辑,就可以了。其他可行的选择是创建一个install 目标,您可以使用它在本地安装您的xgboost 库(使用CMAKE_INSTALL_PREFIX(doc) 变量),然后将安装路径添加到您的CMAKE_LIBRARY_PATH(@ 987654322@)。

【讨论】:

  • 不幸的是,这似乎不是原因。我正在为问题添加一些额外信息,看看是否有帮助。
  • 我用一个非常简约的例子更新了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2015-12-14
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多