Conan软件包:从其他Conan软件包获取编译文件 < >我使用柯南作为C++的依赖管理器,我想创建一个包,它需要从另一个已经编译的柯南包编译文件。 我目前正在尝试为OpenStreetMap库创建一个包OSM二进制文件()

Conan软件包:从其他Conan软件包获取编译文件 < >我使用柯南作为C++的依赖管理器,我想创建一个包,它需要从另一个已经编译的柯南包编译文件。 我目前正在尝试为OpenStreetMap库创建一个包OSM二进制文件(),c++,protocol-buffers,dependency-management,conan,C++,Protocol Buffers,Dependency Management,Conan,此项目的Makefile(可在./OSM binary/src/Makefile中找到)需要一个名为protoc的文件,该文件来自protobuf项目()。在编译了./protobuf/src中的protobuf项目后,可以找到该文件 如果没有此文件,OSM源代码的编译将失败,并出现错误:make:../protoc:Command not found 问题 正如柯南的文档建议的那样,将我需要的文件复制到我的包中的文件夹中,例如头文件到./include,libs到./lib,等等。 根据这一

此项目的Makefile(可在./OSM binary/src/Makefile中找到)需要一个名为protoc的文件,该文件来自protobuf项目()。在编译了./protobuf/src中的protobuf项目后,可以找到该文件

如果没有此文件,OSM源代码的编译将失败,并出现错误:
make:../protoc:Command not found


问题

正如柯南的文档建议的那样,将我需要的文件复制到我的包中的文件夹中,例如头文件到./include,libs到./lib,等等。 根据这一点,在通过make构建protobuf项目之后,我将通过

def package(self):
    self.copy("*.so", dst="lib", keep_path=False)
    self.copy("protoc", dst="scripts", src="./protobuf/src")
转到名为“脚本”的文件夹

但在这一点上,黑魔法开始了。 我的第一个问题是,如何从另一个包访问这些打包文件(例如*.so文件或包中存在的任何其他文件(这里是protoc文件)? 对我来说,即使在阅读了柯南的文档之后,也不清楚柯南如何存储其打包的文件,以及如何访问这些文件或前一步打包的任何其他文件


现在回到OSM项目我的方法是通过
tools.replace
命令在Makefile中手动设置正确的路径。 首先,我声明protobuf打包为一个需求

requires = "protobuf/2.5.0@test/testing"
并将osm Makefile中的相应行(在版本1.3.3中,第7行)替换为到protoc-文件的正确路径

tools.replace_in_file("OSM-binary/src/Makefile",
                      "PROTOC   ?= protoc",
                      "PROTOC   ?= <path-to-file>/protoc")
tools.replace_文件(“OSM binary/src/Makefile”)中的_,
“PROTOC?=PROTOC”,
“PROTOC?=/PROTOC”)
现在,这就引出了我的实际问题:如何获取可在名为scripts的文件夹中的protobuf-包中找到的protoc-文件的路径,还是有其他方法

谢谢,
Chris

从依赖项访问文件有不同的方法:

  • 如果要直接从依赖项运行某些文件,可以使用
    self.run(..,run\u environment=True)
    ,它将自动设置路径、LD\u LIBRARY\u路径等,以便在安装包的位置找到二进制文件。查找更多信息

  • 您可以直接
    从依赖项导入所需的文件,将这些文件复制(在
    build()
    方法之前)到build文件夹中,以便直接在那里使用它们。脚本中可以使用的路径是当前路径,或
    self.build\u文件夹
    。导入的文件将在生成后自动删除,因此不会意外地重新打包。检查

  • 您可以通过
    self.deps\u cpp\u info
    属性从依赖项获取信息。检查一下。这意味着您可以通过以下方法获得
    protobuf
    依赖项的路径

def build(self):
   # Get the directory where protobuf package is installed
   protoc_root = self.deps_cpp_info["protobuf"].rootpath
   # Note this is a list
   protoc_bin_paths = self.deps_cpp_info["protobuf"].bin_paths