【问题标题】:How does one package inter-dependent libraries with Conan?如何用柯南打包相互依赖的库?
【发布时间】:2016-08-01 19:27:44
【问题描述】:

我有一个项目,我正在尝试使用 conan 作为包管理器。 该项目使用了大量的库,其中大部分是自给自足的。但是,其中一些依赖于另一个库。 举个具体的例子,假设我们有一个项目 P,它需要库 A 和 B。A 是自包含的,但 B 的编译和链接依赖于 A。

我可以轻松地为库 A 创建 conanfile.py。我可以为项目 P 创建一个 conanfile.txt。假设 A 和 B 尚未构建,我希望能够输入 P 的构建目录:

conan install ../ --build=missing

并让柯南下载、编译并安装库 A,然后下载编译并安装库 B,其中 B 对 A 的引用正确。

写B的conanfile.py的正确方法是什么?

【问题讨论】:

    标签: conan


    【解决方案1】:

    当你为包 B 编写包配方时,你指定它依赖于 A:

    class PackageB(ConanFile):
        requires = "A/1.0@user/stable"
    

    当您在项目中指定依赖项时(使用 conanfile.txt 或 conanfile.py),您可以像往常一样指定依赖项。 Conan 处理传递依赖,因此它知道它必须首先构建(或检索包二进制文件,如果需要)包 A,然后是包 B。

    通常,包 B 的构建脚本必须考虑到对 A 的依赖。如果使用 CMake,解决方案将使用 cmake 生成器,并使用具有包含目录、库名称的 conanbuildinfo.cmake ,等等。

    文档详细说明了语法: http://docs.conan.io/en/latest/reference/conanfile.html#requirements

    您可以检查一些已经在管理传递依赖项的现有包:

    【讨论】:

    • 感谢您的回答。我很高兴柯南处理了这样的传递依赖。你举cmake包B的例子。如果它是基于./configure的呢?假设它需要运行为: ./configure --with-B= --with-B-libdir=
    • ConfigureEnvironment 助手可以为典型的配置命令生成命令行,检查:docs.conan.io/en/latest/…
    • ConfigureEnvironment 助手在我的情况下效果不佳。我已经尝试过了,但问题之一似乎是编译器设置不正确,如果我记得细节的话。我最终将 CC=... CXX=... 作为尾随参数传递。我确实找到了一个解决方案,那就是使用 self.deps_cpp_info["PackageA"].include_paths[0] 进行包含,类似地用于库目录。
    • 好的,你成功了。您是硬编码 CC=gcc 或类似的,还是使用 CC=self.settings.compiler?如果 ConfigureEnvironment 没有按预期运行,请考虑打开 github issue,也许可以修复。
    • 我硬连线了它。当我有更多时间调查/记录为什么 ConfigureEnvironment 帮助程序对我失败时,我将打开一个 github 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多