CMake链接wxWidgets时TARGET_RUNTIME_DLLS为空如何实现DLL自动拷贝
解决方案
方案1:使用wxWidgets官方CONFIG模式查找(推荐)
你自行编译安装的wxWidgets会在安装目录下生成官方的wxWidgetsConfig.cmake配置文件,该文件会创建带完整IMPORTED_LOCATION_*属性的标准导入目标,无需依赖CMake自带的FindwxWidgets.cmake,TARGET_RUNTIME_DLLS可自动识别依赖的DLL。
修改后的CMakeLists示例如下:
cmake_minimum_required(VERSION 3.16) project(Test) add_executable(Test WIN32 Main.cpp) # 指定安装路径用CONFIG模式查找wxWidgets find_package(wxWidgets REQUIRED COMPONENTS core base CONFIG PATHS ${CMAKE_CURRENT_LIST_DIR}/../thirdparty/my_install ) # 直接链接官方导入目标即可,无需include wxWidgets_USE_FILE target_link_libraries(Test PRIVATE wx::core wx::base) # 此时TARGET_RUNTIME_DLLS已包含wxWidgets的DLL,直接拷贝到输出目录 add_custom_command(TARGET Test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:Test> $<TARGET_FILE_DIR:Test> COMMAND_EXPAND_LISTS )
该方案和你之前链接SDL的逻辑完全一致,无需额外处理DLL路径。
方案2:基于FindwxWidgets输出手动拼接DLL路径
如果因版本等原因必须使用CMake自带的FindwxWidgets.cmake,可以通过其输出的变量手动拼接对应配置的DLL路径,示例如下:
cmake_minimum_required(VERSION 3.16) project(Test) add_executable(Test WIN32 Main.cpp) SET(wxWidgets_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../thirdparty/my_install) find_package(wxWidgets COMPONENTS core base REQUIRED) include(${wxWidgets_USE_FILE}) target_link_libraries(Test PRIVATE ${wxWidgets_LIBRARIES}) if(WIN32 AND wxWidgets_USE_DYNAMIC) # 适配MSVC下Debug版本DLL带d后缀的命名规则 set(WX_DLL_SUFFIX $<IF:$<CONFIG:Debug>,d,>) # 按你编译的wxWidgets版本修改版本号,如3.2.x填32,3.1.x填31 set(WX_VER_SUFFIX 32) set(WX_RUNTIME_DLLS "${wxWidgets_LIB_DIR}/wxbase${WX_VER_SUFFIX}${WX_DLL_SUFFIX}_vc_custom.dll" "${wxWidgets_LIB_DIR}/wxcore${WX_VER_SUFFIX}${WX_DLL_SUFFIX}_vc_custom.dll" ) # 构建后拷贝DLL到输出目录 add_custom_command(TARGET Test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${WX_RUNTIME_DLLS} $<TARGET_FILE_DIR:Test> COMMAND_EXPAND_LISTS ) endif()
注意:请根据你实际编译出来的wxWidgets DLL文件名调整路径和命名规则,避免拷贝失败。
内容的提问来源于stack exchange,提问作者CProg
相关产品推荐
相关产品推荐

