如何使用Conan打包各可执行文件的运行时依赖?
用Conan获取并收集可执行文件的运行时依赖
针对你需要自动收集每个可执行文件运行时依赖、生成库列表和路径的需求,这里有几个实用的Conan原生方案,比手动解析conanfile更高效:
方案1:用Conan命令直接提取依赖信息与路径
生成依赖库列表
用conan inspect命令可以直接获取目标包的依赖和版本信息,过滤出共享库类型的依赖:
# 查看qt包的依赖和编译选项 conan inspect qt/5.15.6 -a requires,options
输出里会包含所有依赖的名称、版本,结合options里的shared配置就能筛选出需要分发的共享库依赖。
获取库的实际存储路径
用conan cache path命令直接定位到库在.conan文件夹里的绝对路径:
conan cache path qt/5.15.6:lib/libQt5Xml.so
这个命令会直接输出你例子里类似~/.conan/data/qt/5.15.6/*/*/package/xxx/lib/libQt5Xml.so的路径,不需要手动拼接。
方案2:在项目conanfile中自定义部署逻辑
如果是你自己的项目包,可以在conanfile.py里通过deploy方法自动收集依赖到暂存区:
from conans import ConanFile class YourExecutablePackage(ConanFile): name = "your_executable" version = "1.0.0" requires = "qt/5.15.6" settings = "os", "compiler", "build_type", "arch" def deploy(self): # 复制单个指定依赖库 qt_dep = self.deps_cpp_info["qt"] self.copy("libQt5Xml.so*", dst="staging/lib", src=qt_dep.libdirs[0]) # 批量复制所有共享库依赖 for dep_name, dep_info in self.deps_cpp_info.dependencies.items(): # 只复制共享库文件 self.copy("*.so*", dst="staging/lib", src=dep_info.libdirs[0])
运行以下命令就能把依赖自动复制到指定的暂存区:
conan deploy your_executable/1.0.0@your_user/your_channel -sf ./staging_area
方案3:结合系统工具与Conan批量处理
如果已经生成了可执行文件,可以用ldd先找出它的动态依赖,再用Conan匹配路径:
- 用
ldd提取可执行文件的动态依赖路径:
ldd ./your_compiled_executable | grep -o "/.*\.so\(\.[0-9]*\)*"
- 写个简单脚本,遍历
ldd的输出,用conan cache path验证并复制到暂存区:
#!/bin/bash STAGING_DIR="./staging/lib" mkdir -p $STAGING_DIR for lib_path in $(ldd ./your_compiled_executable | grep -o "/.*\.so\(\.[0-9]*\)*"); do # 从路径中提取库名(比如libQt5Xml.so) lib_name=$(basename $lib_path) # 尝试用Conan查找该库的缓存路径 conan_path=$(conan cache path *:$lib_name 2>/dev/null) if [ -n "$conan_path" ]; then cp $conan_path $STAGING_DIR fi done
自动生成依赖名称和版本列表
用Conan的Python API写个小脚本,解析项目的依赖树并筛选共享库依赖:
from conans.client.conan_api import ConanAPIV1 def get_runtime_deps(conanfile_path, profile="default"): conan_api = ConanAPIV1() dep_graph = conan_api.deps_graph(conanfile_path, profile=profile) runtime_deps = [] for node in dep_graph.nodes: conanfile = node.conanfile # 只收集以共享库形式构建的依赖 if conanfile.options.get("shared", False): runtime_deps.append({ "name": node.ref.name, "version": str(node.ref.version) }) return runtime_deps # 调用示例 deps_list = get_runtime_deps("./conanfile.py") for dep in deps_list: print(f"库名: {dep['name']}, 版本: {dep['version']}")
内容的提问来源于stack exchange,提问作者ventsyv
相关产品推荐
相关产品推荐

