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
相关产品推荐
相关产品推荐

