使用Conan构建多个依赖库并打包为无需Conan即可使用的归档文件
解决方案
- 先编写子目录中每个依赖的conanfile.py,按照普通Conan包的规则实现
source()、build()、package()方法,package()方法负责将当前依赖编译生成的头文件、库文件等产物复制到包的内置输出目录即可,不需要提前单独执行构建、导出命令。 - 先将本地子目录的依赖注册为Conan可编辑包,执行以下命令一次即可,后续修改子目录代码也不用重新注册:
conan editable add json/3.10.4 nlohmann_json/3.10.4@local conan editable add opencv/4.4.0 opencv/4.4.0@local # 如果需要opencv5.1.0就再加对应注册命令
- 根目录的conanfile.py直接作为依赖聚合的消费端配置,不需要实现源码拉取、编译逻辑,示例代码如下:
from conans import ConanFile import os class DepBundleConan(ConanFile): settings = "os", "arch", "compiler", "build_type" # 声明需要打包的依赖 requires = [ "nlohmann_json/3.10.4@local", "opencv/4.4.0@local" ] # 强制所有依赖从源码编译,不使用任何预编译二进制包 def configure(self): self.build_policy = "always" def deploy(self): # 按照你的要求定义输出目录名,Windows x86_64对应win64_x86可直接写死 output_folder = f"{self.settings.os}_{self.settings.arch}".lower() # 遍历所有依赖,聚合产物 for dep in self.dependencies.values(): # 复制头文件 self.copy("*", src=os.path.join(dep.package_folder, "include"), dst=os.path.join(output_folder, "include")) # 复制静态库/动态库导入库 self.copy("*.a", "*.lib", src=os.path.join(dep.package_folder, "lib"), dst=os.path.join(output_folder, "lib")) # 如需复制Windows动态库,新增以下行即可 # self.copy("*.dll", # src=os.path.join(dep.package_folder, "bin"), # dst=os.path.join(output_folder, "bin"))
- 单命令执行全流程构建和聚合,根目录直接执行以下命令即可,无需进入子目录操作:
conan install . -s os=Windows -s arch=x86_64 -s compiler="Visual Studio" -s compiler.version=16 -s build_type=Release --build=*
执行完成后,根目录就会生成你需要的win64_x86目录结构,直接交给CI/CD归档即可。
如果不想使用Conan,也可以选择vcpkg作为替代工具:自定义编译规则后执行vcpkg install opencv4 nlohmann-json --triplet=x64-windows,再执行vcpkg export --zip就能直接导出聚合好的依赖包,也符合从源码编译、无远程预编译依赖的要求。
内容的提问来源于stack exchange,提问作者jacky la mouette
相关产品推荐
相关产品推荐

