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

如何将所有Conan共享库复制到CMake项目构建目录

实现Conan共享库自动复制到CMake可执行目录的配置方法

下面两种方案都能实现需求,优先选第一种,维护成本最低。

方案1:CMake构建后自动复制(日常开发推荐)

不用改Conan包逻辑,只要在项目CMake配置里加几行命令就行,全平台自动适配dll/dylib/so:

  • 先确认Conan生成器配置,在conanfile.txt中声明使用标准CMake生成器:
[generators]
CMakeDeps
CMakeToolchain

如果还在用Conan 1.x版本,把CMakeDeps替换为cmake_find_package_multi即可。

  • 在项目CMakeLists.txt中,声明完可执行目标、完成Conan依赖链接之后,加构建后复制逻辑:
# 声明你的可执行目标
add_executable(your_app main.cpp)
# 链接所有需要的Conan依赖,示例:target_link_libraries(your_app PRIVATE custom_pkg::custom_pkg)
target_link_libraries(your_app PRIVATE <这里替换成你实际的Conan依赖目标>)

# CMake 3.21及以上版本用这段,自动抓取所有运行时依赖的共享库
add_custom_command(TARGET your_app POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        $<TARGET_RUNTIME_DLLS:your_app>
        $<TARGET_FILE_DIR:your_app>
    COMMAND_EXPAND_LISTS
    COMMENT "Copying runtime shared libraries to executable folder"
)

如果你的CMake版本低于3.21,或者在macOS/Linux下上面的命令没抓到dylib/so文件,把上面的自定义命令替换成下面这段,直接用Conan自动注入的变量复制:

add_custom_command(TARGET your_app POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:your_app>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CONAN_RUNTIME_LIBS}
        $<TARGET_FILE_DIR:your_app>
    COMMENT "Copying Conan runtime shared libraries to executable folder"
)

CONAN_RUNTIME_LIBS是Conan生成配置时自动填充的变量,会包含所有依赖链上的共享库绝对路径,不管是你自己做的自定义Conan包还是第三方公共包,只要包的package_info配置正确,都会被自动收集,不需要手动枚举每个包的库路径。

方案2:Conan安装阶段复制(适合打包发布场景)

如果不想在CMake里写构建逻辑,可以直接在Conan安装依赖时就把所有共享库导出到指定目录:

  • 在项目根目录新建deploy.py脚本:
from conan.tools.files import copy
def deploy(graph, output_folder, **kwargs):
    conanfile = graph.root.conanfile
    for dep in conanfile.dependencies.values():
        # 复制Windows dll
        copy(conanfile, "*.dll", dep.cpp_info.bindir, output_folder)
        # 复制macOS dylib
        copy(conanfile, "*.dylib", dep.cpp_info.libdir, output_folder)
        # 复制Linux so
        copy(conanfile, "*.so*", dep.cpp_info.libdir, output_folder)
  • 安装依赖时指定deploy脚本,把所有共享库直接输出到构建目录:
conan install . --deploy=./deploy.py --output-folder=build

之后把CMake的可执行文件输出目录设为和build目录一致即可,不需要额外复制操作。

避坑提示

  • 自定义Conan包必须在package_info方法里正确配置cpp_info.libs、cpp_info.bindir(Windows下dll所在目录)、cpp_info.libdir(类Unix系统下共享库所在目录),否则Conan无法识别到对应的共享库资产。
  • 使用Visual Studio多配置生成器(Debug/Release切换)时,上面的POST_BUILD命令会自动匹配当前构建配置的库版本,不需要手动区分路径。
  • macOS下如果遇到dylib加载报错,可以在CMake配置里加两行配置,让可执行文件优先从自身目录加载依赖:
    set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
    set(CMAKE_INSTALL_RPATH "@executable_path")
    

内容的提问来源于stack exchange,提问作者asmbaty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:06:19