【问题标题】:How to bring external dependencies into cross-platform CMake project?如何将外部依赖项引入跨平台 CMake 项目?
【发布时间】:2020-04-28 22:17:59
【问题描述】:

将外部依赖项引入跨平台 CMake 项目的最佳方法是什么?请参阅下面我看到的问题范围和解决方案。

问题范围

假设我们有一个具有以下约束的 C/C++ 项目:

  • CMake 是构建系统;
  • 必须针对不同平台构建(桌面、Android NDK / Yocto SDK、iOS);
  • 具有使用 CMake 构建的外部依赖项(例如 Google 测试);
  • 具有基于非 CMake 的外部依赖项(例如 SQLite 合并、Boost);
  • 并非所有依赖项都有 Git 上游(例如 SQLite 保存在化石中)。

很高兴有东西:

  • 自动下载依赖项,让新开发者开始编码的步骤更少;
  • 以 IDE(如 CLion)可以自动完成的方式配置依赖项(无需执行额外的配置步骤)。

可能的解决方案

  • Git 子模块(不清楚如何处理基于非 Cmake 且未保存在 Git 依赖项中);
  • Google Repo 工具(与之前的问题相同);
  • CMake ExternalProject(在生成阶段下载、解压并可能使用 CMakeLists.txt 进行修补,并使用 add_subdirectory 包含到项目中)。 我根据 Craig Scott 在 [3] 中的 [2] 回答创建了一个 PoC[1]。

参考文献

【问题讨论】:

  • 您有 2 种方法有缺点,另一种方法 - ExternalProject - 没有它们。那么,为什么不遵循第三种方法呢?什么是问题
  • @Tsyvarev,我很期待知道我没有想到的方法。
  • 鉴于这种非常通用的信息,寻找方法只是一个“建议”问题,我们倾向于在 Stack Overflow 上避免。相反,我们更愿意专注于特定问题。见help center
  • @Tsyvarev,我认为这个主题非常具体(考虑到所有限制)但也非常概念化。由于在这种情况下缺乏明确的指导,我认为这个问题带来了很好的价值。
  • 其实这些“约束”有模糊的意思。例如。你写“必须为不同的平台构建......Android NDK”,并评论FetchContent模块在Android NDK中无法访问的答案。但这是一个真正的问题吗?人们可以使用来自官方 CMake 的 FetchContent.cmake 模块复制轻松运送他/她的项目,以便在旧 CMake 版本中工作。然后,您希望同时使用 CMake 和非基于 CMake 的依赖项。但是是什么阻止了以不同方式处理这两种依赖关系?

标签: c++ git cmake dependencies dependency-management


【解决方案1】:

您的 PoC 可能会工作,但 CMake 有一个内置的 solution 用于在配置步骤中获取外部项目。如果这不能满足您的要求,例如基于非 CMake 的依赖项,您可以查看 Conan

https://blog.conan.io/2018/06/11/Transparent-CMake-Integration.html

【讨论】:

  • FetchContent 很棒,在我的 PoC 中省略了这个丑陋的执行步骤,但似乎这个模块在 Android NDK 附带的 CMake 版本中不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
相关资源
最近更新 更多