You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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匹配路径:

  1. 用ldd提取可执行文件的动态依赖路径:
ldd ./your_compiled_executable | grep -o "/.*\.so\(\.[0-9]*\)*"
  1. 写个简单脚本,遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:43:29