Conan如何聚合多个依赖包生成无Conan依赖的可独立分发归档
解决方案
Conan 2.x 最优方案(推荐)
无需手动修改配置文件,直接用CMakeDeps生成器搭配部署逻辑即可实现需求:
- 在你的
conanfile.py中添加如下逻辑,生成相对路径的CMake配置并同步到部署目录:
from conan import ConanFile from conan.tools.cmake import CMakeDeps from conan.tools.files import copy class DepsBuilder(ConanFile): settings = "os", "compiler", "build_type", "arch" def generate(self): # 生成所有依赖的纯CMake配置文件,无Conan依赖 cmake_deps = CMakeDeps(self) cmake_deps.set_property("cmake_find_mode", "config") cmake_deps.generate() # 拷贝生成的CMake配置到部署目录的cmake子目录 copy(self, "*.cmake", self.generators_folder, f"{self.build_folder}/cmake") # 同步所有依赖的头文件、库、二进制到对应目录 for dep in self.dependencies.values(): copy(self, "*.h*", dep.cpp_info.includedirs[0], f"{self.build_folder}/include") copy(self, "*.a", dep.cpp_info.libdirs[0], f"{self.build_folder}/lib") copy(self, "*.so*", dep.cpp_info.libdirs[0], f"{self.build_folder}/lib") copy(self, "*.dll", dep.cpp_info.bindirs[0], f"{self.build_folder}/bin") copy(self, "*.lib", dep.cpp_info.libdirs[0], f"{self.build_folder}/lib")
- 执行构建打包命令:
mkdir build conan install <conanfile路径> -of build tar cf archive.tar build
- 其他机器使用时无需安装Conan,仅需传入部署目录的CMake配置路径即可,原项目
CMakeLists.txt的find_package逻辑完全不需要修改,实现无侵入适配:
cmake .. -DCMAKE_PREFIX_PATH=/path/to/extracted/build/cmake
Conan 1.x 兼容方案
如果仍在使用Conan 1.x,可通过生成器加简单脚本实现:
- 执行install时指定两个生成器,输出CMake配置和依赖信息:
conan install <conanfile路径> -if build -g cmake_find_package -g json
- 写简单脚本读取
conanbuildinfo.json中的本地缓存路径,批量将所有生成的XXXConfig.cmake中的绝对路径替换为${CMAKE_CURRENT_LIST_DIR}/../开头的相对路径,指向部署后的include、lib目录即可。
验证方法
解压归档后执行如下命令即可验证是否脱离Conan正常运行:
mkdir test_build && cd test_build cmake .. -DCMAKE_PREFIX_PATH=/path/to/extracted/build/cmake # 检查输出无依赖未找到的报错即配置成功
内容的提问来源于stack exchange,提问作者jacky la mouette
相关产品推荐
相关产品推荐

