如何让CMake为目标安装PDB文件

30

我该如何让CMake安装伴随所需的PDB文件,以便调试由Visual Studio生成的DLL文件和EXE文件?

1个回答

37

我曾经为回答这个问题而苦苦挣扎,现在我认为我找到了一个好的解决方案:使用安装文件命令和$<TARGET_PDB_FILE:tgt>生成器表达式(在CMake 3.1.3及更高版本中可用)。具体来说,下面的安装命令似乎有效。该命令将把目标${PROJECT_NAME} pdb文件复制到目标的安装bin目录中。

install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)

该命令将会为每一个生成pdb文件的配置安装pdb文件。通过使用OPTIONAL选项,如果源pdb文件不存在,安装命令不会报错。该命令旨在用于使用add_library(${PROJECT_NAME} ...)add_executable(${PROJECT_NAME} ...) 命令创建的目标。

这是我找到的最好的答案。如果有更好的答案,请告诉我。我在cmake-generator-expressions文档的“信息表达式”部分中发现了一些难以理解的TARGET_PDB_FILE生成器表达式的说明。


4
根据文档,这仅适用于由链接器生成的.PDB文件,因此不适用于静态库。 - Noki
@Noki,你是正确的。这个答案只适用于共享库。你找到了静态库的方法吗? - Ali
7
对于静态库,您可以使用Compile Pdbs。您应该使用目标属性COMPILE_PDB_OUTPUT_DIRECTORY和COMPILE_PDB_NAME,个人建议使用库输出目录和库名称,因为这样在安装方法中更易于访问。然后我使用 install(FILES "$<TARGET_FILE_DIR:${Name}>/${Name}.pdb" DESTINATION "lib/static/$<CONFIG>/${Name}" OPTIONAL) 但是选择权在您手中。文档参考:https://cmake.org/cmake/help/v3.3/prop_tgt/COMPILE_PDB_OUTPUT_DIRECTORY.html#prop_tgt:COMPILE_PDB_OUTPUT_DIRECTORY - Noki
9
值得一提的是,可以控制安装哪些构建类型的文件:install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> CONFIGURATIONS "RelWithDebInfo" DESTINATION bin) - Innokentiy Alaytsev
我们能通过命令行参数传递这个信息吗?因为不想修改现有的CMake文件。 - Prasaathviki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接