如何将所有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
相关产品推荐
相关产品推荐

