如何将一个包与Conan相互依赖的库结合起来?

如何将一个包与Conan相互依赖的库结合起来?,conan,Conan,我有一个项目,我正试图使用柯南作为包经理。 该项目使用了大量的库,其中大部分是自给自足的。然而,其中一些依赖于另一个库。 举一个具体的例子,假设我们有一个项目P,它需要库a和B。a是自包含的,但B依赖于a进行编译和链接 我可以轻松地为库A创建conanfile.py。我可以为项目p创建conanfile.txt。假设A和B尚未生成,我希望能够在p的生成目录中键入: conan install ../ --build=missing 让柯南下载、编译并安装库A,然后下载编译并安装库B,其中B对A

我有一个项目,我正试图使用柯南作为包经理。 该项目使用了大量的库,其中大部分是自给自足的。然而,其中一些依赖于另一个库。 举一个具体的例子,假设我们有一个项目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的正确方法是什么?

当您为B包编写包配方时,您指定它取决于A:

class PackageB(ConanFile):
    requires = "A/1.0@user/stable"
在项目中指定依赖项时(使用conanfile.txt或conanfile.py),可以像往常一样指定依赖项。Conan处理可传递的依赖项,因此它知道必须先构建(或检索包二进制文件,如果需要)包A,然后构建包B

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

这些文档详细说明了语法:

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

  • ZMQC++封装器,它依赖于ZMQ,并且是一个非常简单的例子,因为包装器仅是头文件:
  • Boost(取决于Zlib、BZip,但有条件地检查conanfile的
    config()
    方法):
  • Poco也有条件地依赖于OpenSSL、MySQLClient:

谢谢你的回答。我很高兴柯南能处理这样的可传递依赖关系。您给出了cmake包B的示例。如果它是./configure-based呢?假设它需要以如下方式运行:./configure--with-B=--with-B-libdir=ConfigureEnvironment helper可以为典型的configure命令生成命令行,请检查:在我的示例中,ConfigureEnvironment helper工作不正常。我已经试过了,但其中一个问题似乎是编译器的设置不正确,如果我记得细节的话。我最终通过了CC=。。。CXX=。。。作为尾随参数。不过我确实找到了一个解决方案,那就是使用self.deps_cpp_info[“PackageA”]。include_路径[0]用于include,类似地用于library目录。好的,很好,你让它工作了。您是否硬编码了CC=gcc或类似代码,或者是否使用了CC=self.settings.compiler?如果配置环境不符合预期,请考虑打开GITHUB问题,也许它可以被修复。当我有更多的时间调查/记录ConfigureEnvironment helper失败的原因时,我将打开一个github问题。