【问题标题】:Including external header library from github using cmake使用 cmake 包含来自 github 的外部头库
【发布时间】:2017-06-01 22:50:16
【问题描述】:

有一个 GitHub 存储库,其中仅包含 hpp 文件,没有 CMakeList.txt 文件。

我需要在我的项目中包含这些头文件。我不想手动克隆它们然后链接它们。我希望每次调用cmake 命令时,cmake 都会克隆它们并将它们放在某个内部文件夹中。

有可能吗?如果是,我怎样才能做到这一点?

【问题讨论】:

  • I want that each time I call cmake command, cmake will clone them and put them in some inner folder. - 像往常一样,ExternalProject_Add 将处理项目的下载。由于您不需要配置和其他步骤,您可以将适当的 COMMAND 设置为空字符串。
  • 相关:This question 讨论了如何为 Catch 单元测试库执行此操作,该库仅是标头。

标签: c++ git cmake


【解决方案1】:

您可能需要考虑DownloadProject github 项目中使用的方法,其中包含一个为 GoogleTest 存储库执行下载步骤的示例。它在配置阶段而不是构建阶段调用 CMake 的 ExternalProject 模块,因此外部源在配置时可用,这似乎也是您想要的。在您的情况下,您不需要使用add_subdirectory() 的后续步骤将外部项目中的任何内容拉入主构建,因此只需下载即可。 this answer也引用了这种方法。

使用DownloadProject 看起来像这样(取自作为 github 项目的一部分提供的示例):

include(DownloadProject.cmake)
download_project(PROJ           googletest
                 GIT_REPOSITORY https://github.com/google/googletest.git
                 GIT_TAG        master
)

然后,下载的源将在变量${googletest_SOURCE_DIR} 中存储的目录下可用。请参阅DownloadProject 源代码中的完全通用实现以了解其工作原理。您可以简单地将其嵌入您自己项目的源代码中,然后重新使用它来有效地处理下载您可能需要的任何外部依赖项。

【讨论】:

    【解决方案2】:

    我设法做到了:

    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes)
    execute_process(
        COMMAND git clone "xxxxx.git" lib_name
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes)
    
    include_directories(${CMAKE_CURRENT_BINARY_DIR}/external_includes)
    

    此方法已在带有 MSVS 的 Windows 和带有 GCC 的 Ubuntu 上进行了测试。

    当然,最好使用 Hunter 或任何包管理器之类的工具,但有时需要快速简单的解决方案。

    【讨论】:

    • 这将在每次运行 CMake 时尝试执行 git clone,即使您已经克隆了它。
    【解决方案3】:

    我在 json cpp repo 发现的另一个选项:

    FetchContent_Declare(json
        GIT_REPOSITORY https://github.com/nlohmann/json.git
        GIT_TAG v3.7.3)
    
    FetchContent_GetProperties(json)
    if(NOT json_POPULATED)
        FetchContent_Populate(json)
        add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL)
    endif()
    

    恕我直言看起来更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多