【问题标题】:Install only a part of boost using conan使用 conan 仅安装 boost 的一部分
【发布时间】:2020-08-20 15:51:14
【问题描述】:

我正在使用 conan 包管理器为项目安装我的依赖项。该项目只需要所有 boost 库的 boost 系统,因为我只使用 asio 和 beast。

但是,柯南安装了 boost 的每个部分,这是不可取的。如果我通过 Mac 机器上的 docker 容器安装它,则需要一个多小时,并且柯南缓存中的 boost 目录在任何平台上都超过 1 GB,这比所有其他库重十倍 结合

我只想安装 Boost.system,它通常应该是相当轻量级的。有没有办法做到这一点?这是我的柯南文件的内容:

[requires]
boost/1.73.0 # here! I'd like something like "boost.system/1.73.0"
nlohmann_json/3.9.0
fmt/7.0.2
# other libs...

[generators]
cmake

[options]
nlohmann_json:implicit_conversions=False

我需要 boost 1.73,我很快就会切换到需要 1.74。

在我的 CMake 中,我这样做:

target_link_libraries(my_app PRIVATE Boost::system)

一切都在那里工作,但它仍然比应有的重得多,而且它显着减慢了部署速度。

【问题讨论】:

  • 你检查了 boost 的选项吗?
  • 嗯,我在哪里检查这些选项?我对柯南很陌生。
  • 你应该检查conanfile.py,但我什么也没找到

标签: c++ boost conan


【解决方案1】:

您正在寻找来自 Conan Center Index 的 Boost 1.73.0,这是 CCI 中可用的最新版本。但是,这个想法将使用Components,而不是为每个模块创建一个新配方。为什么?我们从 Bincrafters 那里学到了难以维护的东西,一些修复可能会影响所有模块,并且复制需要更多的努力。因此,主要思想将消耗boost/1.73.0,就像您拥有的一样,但只需要您需要的东西:

target_link_libraries(foobar boost::system)

目前,有一个Pull Request 正在开发中,用于在 Boost 中提供组件。在 Bincrafters 方面,由于柯南中心指数的优势,模块化 Boost 更新已停止。主要挑战之一是解决 Boost 模块之间的循环依赖,在 Bincrafters 中我们是“手动”完成的,但现在在 CCI 中我们使用的是 boost-dep,这会更好。

如果您没有可用的 boost.system,您现在可以做什么?使用选项,禁用你不想要的东西并从源代码构建。或者,使用find_library 仅列出 Boost.System

Update:现在,Pull Request 被合并到 CCI 中,并且所有 conan boost 版本都可以使用 boost 组件(从 1.69.0 开始)。

【讨论】:

  • 作为后续行动,您是否必须明确指出正在使用哪些 Boost 库,或者有没有办法根据 conanfile.py 中的内容使用柯南生成器来做到这一点?我一直在尝试基于文档的东西,但不能在任何地方。我想为不仅仅依赖于 Boost ASIO 的东西这样做,而不必明确列出 CMake 的每个库。
  • 看看 Boost 测试包,它就像一个很好的例子,如何只使用特定的模块:github.com/conan-io/conan-center-index/blob/master/recipes/…
  • 基于此,对于 CMake 来说,唯一的选择是使用对库的特定引用,而不是作为 CMake 生成一部分的任何类型的柯南变量。对于小型项目来说,使用特定的库似乎没问题,但是如果依赖项开始增加,那么它会使 CMake 过程变得更加乏味,并且需要消费者知道树中的所有依赖项才能正确链接。那么有没有围绕这个进行任何讨论?也许这是可以预期和接受的,这很好,但我一直在尝试只对柯南及其家族进行依赖管理。
  • 意味着我在消费时真正想做的是将组件指定为所包含项目要求的一部分,并将其转换为 conanbuildinfo.cmake 中的变量,这样我就不需要在 CMakeLists.txt 中指定我想要的那些,然后在其中使用 ${CONAN_LIBS} 并获取我想要的项目组件。如果有任何地方正在讨论这个问题,请告诉我,我可以在那里交谈。
  • 消费者不需要知道所有的依赖关系,这些依赖关系由 CMake 目标解决。如果 Boost.system 需要另一个 Boost 库或项目,CMake 将解决它。此外,如果您有 Cmake 目标,则不需要 CMake 变量,结果相同甚至更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2020-03-15
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
相关资源
最近更新 更多