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

Windows下Conan未部署Boost DLL引发运行时异常

问题:Windows下Conan依赖Boost共享库无法找到DLL,Ubuntu运行正常

1. 配置详情

我有一个名为Package的Conan包配方,依赖Boost共享库,相关配置如下:

Conan requirements 配置

def requirements(self):
        self.requires("boost/1.79.0@")
        self.options["boost"].shared = True
        self.options["boost"].bzip2 = False
        self.options["boost"].without_stacktrace = True

Conan 生成器配置

使用CMakeDeps和CMakeToolchain生成器:

def generate(self):
        tc = CMakeToolchain(self)
        tc.variables['BUILD_SHARED_LIBS'] = "ON" if self.options.shared == True else "OFF"
        tc.variables['CMAKE_FIND_ROOT_PATH_MODE_PACKAGE'] = 'NEVER'
        tc.variables['CMAKE_POSITION_INDEPENDENT_CODE'] = 'ON'

        tc.generate()

单元测试配置

包的单元测试通过CMakeLists.txt定义PackageTests目标,链接Package和boost::boost。

2. 问题现象

  • Ubuntu和Windows上均可正常构建Package及PackageTests
  • Ubuntu上测试可直接运行,通过ldd PackageTests和readelf -d PackageTests能看到Boost的so文件从Conan缓存加载
  • Windows上测试构建成功,但运行时全部因找不到Boost DLL抛出异常;激活Conan的VirtualRunEnv生成器环境后,PackageTests.exe可正常运行

我想知道:有没有纯CMake的方法将所需Boost DLL复制到bin/PackageTests.exe目录?或者能否扩展Conan配方在Windows上自动部署这些DLL?

3. 已尝试的操作及问题

CMake复制DLL失败

尝试用以下CMake命令复制DLL,但TARGET_RUNTIME_DLLS生成表达式为空,导致命令执行错误:

add_custom_command(TARGET PackageTest POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:PackageTest > $<TARGET_FILE_DIR:PackageTest>
  COMMAND_EXPAND_LISTS
)

获取目标属性失败

查询相关目标的IMPORTED_LOCATION属性,结果均为*-NOTFOUND:

get_target_property(VAR-boost boost::boost IMPORTED_LOCATION)
message(${VAR-boost})
> VAR-boost-NOTFOUND

get_target_property(VAR-Package Package IMPORTED_LOCATION)
message(${VAR-Package})
> VAR-Package-NOTFOUND

get_target_property(VAR-PackageTest PackageTest IMPORTED_LOCATION)
message(${VAR-PackageTest})
> VAR-PackageTest-NOTFOUND

CMakeDeps生成脚本情况

从Boost Conan配方的package_info()可知,CMakeDeps仅生成BoostConfig.cmake和BoostTargets.cmake脚本(我的Package包也是如此),不会生成FindBoost.cmake。默认CMakeDeps仅生成配置脚本,除非配方定义cmake_find_mode为both,但Boost配方托管在conan-center-index仓库,我无法直接修改。

4. 核心疑问

  • 为什么Ubuntu上Conan能自动找到缓存中的Boost so文件,Windows上却无法找到DLL?
  • Conan是否应该自动处理Windows下的DLL部署,还是必须手动操作?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:05:22