如何将Boost DLL文件输出到CMake install指定的安装目录
解决方案
你可以借助CMake 3.21及以上版本内置的$<TARGET_RUNTIME_DLLS>生成器表达式实现需求,该方案天然符合你的跨平台要求:
- Windows下vcpkg默认triplet为动态链接,表达式会自动识别目标依赖的所有动态DLL文件
- Linux下vcpkg默认triplet为静态链接,表达式返回空值,不会执行多余的安装操作
代码修改
保留原有CMakeLists.txt内容不变,新增如下安装规则即可:
# 原有代码保持不变 find_package(Boost REQUIRED COMPONENTS filesystem locale) [...] target_link_libraries(${PROJECT_NAME} PRIVATE MyOtherSharedLibrary Boost::headers Boost::filesystem Boost::locale ) # 新增安装规则 # 1. 安装项目自身的二进制文件 install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) # 2. 自动安装依赖的动态库(仅Windows生效) install(IMPORTED_RUNTIME_ARTIFACTS $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> DESTINATION bin )
验证方式
执行安装命令后:
- Windows平台下,安装目录的
bin文件夹会同时包含你编译生成的二进制和对应的Boost DLL文件 - Linux平台下,安装目录只会包含你编译生成的二进制文件,不会有多余的Boost相关文件
低版本CMake兼容方案
如果你使用的CMake版本低于3.21,可以使用平台判断的兼容方案:
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) if(WIN32) # 直接匹配构建目录下的Boost DLL文件到安装目录 install(DIRECTORY ${CMAKE_BINARY_DIR}/ DESTINATION bin FILES_MATCHING PATTERN "boost_*.dll" PATTERN "CMakeFiles" EXCLUDE PATTERN "*.dir" EXCLUDE ) endif()
内容的提问来源于stack exchange,提问作者keinkoenig
相关产品推荐
相关产品推荐

