使用CMake时,如何将vcpkg库的.pdb文件复制到构建目录?
Debug/RelWithDebInfo模式下vcpkg未同步复制依赖库的.pdb文件问题
我正将项目迁移到CMake+vcpkg,但在Debug或RelWithDebInfo构建模式下,构建过程只会复制vcpkg中的.dll文件,对应的.pdb文件没有同步复制到输出目录。
示例CMakeLists.txt
cmake_minimum_required(VERSION 3.22) project(PdbTest) find_package(fmt CONFIG REQUIRED) add_executable(Test main.cpp) target_link_libraries(Test PRIVATE fmt::fmt)
执行的构建命令
cmake .. --toolchain C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake cmake --build . --config RelWithDebInfo
输出目录文件列表
构建完成后,<build-dir>\RelWithDebInfo目录下仅生成以下文件,缺少fmt.pdb:
25/07/2022 06:54 am 134,144 fmt.dll 25/07/2022 07:04 am 41,984 Test.exe 25/07/2022 07:04 am 1,028,096 Test.pdb
我了解到vcpkg内部有vcpkg_copy_pdbs.cmake脚本,可在vcpkg构建库时将.pdb复制到安装目录,考虑过复制该脚本到项目中使用但可能需要调整,想知道有没有更优的解决方案?
解决方案
1. 启用vcpkg自动PDB复制(推荐)
vcpkg新版本已支持自动将依赖库的PDB文件复制到输出目录,确保你的vcpkg是最新版本后,可通过以下方式启用:
- 在CMakeLists.txt中添加配置:
set(VCPKG_APPLOCAL_DEPS_DEBUG ON) set(VCPKG_APPLOCAL_DEPS_RELWITHDEBINFO ON) - 或者在cmake配置命令中传递参数:
cmake .. --toolchain C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_APPLOCAL_DEPS_DEBUG=ON -DVCPKG_APPLOCAL_DEPS_RELWITHDEBINFO=ON
2. 自定义CMake POST_BUILD命令复制PDB
如果上述方法不生效,可编写自定义命令,在目标构建完成后自动复制依赖库的PDB:
add_custom_command(TARGET Test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_PDB_FILE:fmt::fmt> $<TARGET_FILE_DIR:Test> COMMENT "Copying fmt.pdb to output directory" )
若有多个依赖库,可重复此逻辑,或编写循环批量处理所有依赖目标。
3. 复用vcpkg的vcpkg_copy_pdbs脚本
将vcpkg的vcpkg_copy_pdbs.cmake脚本复制到项目目录,在CMakeLists.txt中引入并调用:
include(vcpkg_copy_pdbs.cmake) vcpkg_copy_pdbs(TARGET Test)
需注意脚本中的路径逻辑可能需要适配你的项目结构,确保能正确定位到vcpkg安装的库的PDB文件。
内容的提问来源于stack exchange,提问作者wozname
相关产品推荐
相关产品推荐

