如何使用CMake复制Qt动态库的.pdb文件?
复制Qt动态库PDB文件的问题及解决方法
现有可行的DLL复制命令
目前可以通过以下CMake命令成功复制Qt动态库的.dll文件:
add_custom_command(TARGET myproject POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt6::Core> $<TARGET_FILE_DIR:myproject>/$<TARGET_FILE_NAME:Qt6::Core> )
复制PDB文件时遇到的问题
尝试复制.pdb文件时碰到两个问题:
- 使用
$<TARGET_PDB_FILE:Qt6::Core>时,报错:TARGET_PDB_FILE not allowed for IMPORTED targets - 使用
$<TARGET_FILE_BASE_NAME:Qt6::Core>.pdb时,出现文件复制错误,无法定位正确的PDB文件路径
我的CMake执行步骤
set CMAKE_PREFIX_PATH=C:\Qt\6.6.0\msvc2019_64 mkdir build cd build cmake .. cmake --build .
解决方法
Qt的目标属于CMake导入目标(IMPORTED targets),这类目标不会自动提供PDB文件的路径属性,需要手动拼接或指定路径:
方法1:从DLL所在目录拼接PDB路径
Qt的PDB文件通常和DLL位于同一目录,可通过DLL路径推导PDB位置:
add_custom_command(TARGET myproject POST_BUILD # 复制DLL COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt6::Core> $<TARGET_FILE_DIR:myproject> # 复制PDB COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<PATH:GET_DIRNAME,$<TARGET_FILE:Qt6::Core>>/$<TARGET_FILE_BASE_NAME:Qt6::Core>.pdb" $<TARGET_FILE_DIR:myproject> )
方法2:直接指定Qt安装目录下的PDB路径
若PDB文件位于Qt安装目录的lib子目录(部分Qt版本的调试符号存放位置),可直接指定路径:
set(QT_PDB_PATH "${CMAKE_PREFIX_PATH}/lib") add_custom_command(TARGET myproject POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${QT_PDB_PATH}/$<TARGET_FILE_BASE_NAME:Qt6::Core>.pdb" $<TARGET_FILE_DIR:myproject> )
方法3:使用Qt官方工具自动处理
推荐使用Qt自带的windeployqt工具,它会自动复制所有依赖的DLL、PDB及必要资源,无需逐个手动配置:
add_custom_command(TARGET myproject POST_BUILD COMMAND ${CMAKE_PREFIX_PATH}/bin/windeployqt.exe --no-translations --no-system-d3d-compiler --no-opengl-sw $<TARGET_FILE:myproject> )
内容的提问来源于stack exchange,提问作者kerrytazi
相关产品推荐
相关产品推荐

