【发布时间】:2020-01-03 16:38:47
【问题描述】:
我在名为<libraryBuildDir> 的文件夹中构建了一个第 3 方静态库,并将生成的 *.lib 文件复制到我的项目文件夹结构中。除了*.lib,我还放置了*.pdb 文件。然后我删除了<libraryBuildDir>,假设它不再需要。这是以前对其他库有效的方法,它遵循what seems to be a common practice。
但是,当我在调试配置中构建项目时,我收到许多这样的 LNK4099 警告(粗略翻译):
<myLib>.lib(<someObjFromTheLib>.obj) : warning LNK4099: PDB "<myLib>.pdb" was not found alongside "<myLib.lib>" or "<myBuildDir>". Linking without debug info
我确认 *.pdb 文件就在 *.lib 文件旁边。 作为测试,我按照警告的建议将它直接放入构建目录中。现在我得到了很多这样的 LNK4204:
<myLib>.lib(<someObjFromTheLib>.obj) : warning LNK4204: "<myBuildDir>\<myLib>.pdb" is missing debugging information for referencing module; linking object as if no debug info
我按照this advice 提取了出现在我的警告中的一个目标文件 (<someObjFromTheLib>.obj)。我注意到提取的 *.obj 文件不包含 Debug$T 部分。
显然,当我将 *.pdb 文件从 <libraryBuildDir> 复制到我的项目时,我破坏了一些指向其他调试符号文件的链接,这些文件现在不再可用,因为我删除了 <libraryBuildDir>。这让我觉得我的整个过程都是错误的。
我的目标:用调试符号编译静态库,并将完成的 *lib 文件移动到另一个项目。然后编译另一个项目并包含来自静态库的完整调试符号。
如何在不破坏任何引用的情况下将 pdb 文件从临时库构建目录移动到另一个目录?
(旁注:我正在使用 cmake 编译 Crypto++ v8.2.0,*.pdb 文件称为 cryptopp-object.pdb,而库称为 cryptopp-static.lib。这违反了 *.lib 和 *.pdb 的约定相同的名称,但它是 Crypto++ 的配置方式,如果可能,我不想更改它。但是,*.lib 文件似乎期望其 pdb 文件的名称正确,所以我认为这很好。)
(另外:lib /list <myLib>.lib 列出了很多 *.obj 文件,其中只有一些出现在我的 LNK4099 警告中,而其他则没有。我不知道这是否意味着它们根本没有在我的项目,或者如果他们有所有可用的调试信息。)
【问题讨论】:
-
链接是从链接器包含文件夹完成的,pdb 在那里吗? pdb 和 lib 是否来自同一个“构建”?你在混合发布和调试版本吗?
-
您可以使用 /Fd 编译选项将程序数据库放在您不打算删除的目录中。但是不删除该目录当然要容易得多。
-
@Robert Andrzejuk 是的,pdb 文件位于实际 lib 文件旁边的包含文件夹中。不,我确实首先编译了 lib 并从另一个构建中复制了 pdb,假设构建是确定性的并且每次都产生相同的输出(两者之间没有更改设置)。事实证明,如果我从完全相同的运行中重新编译并复制 lib 和 pdb,问题似乎就消失了。为什么结果不是确定性的?
-
确定性是什么意思? lib 和 pdb 必须一起复制。
标签: c++ visual-studio pdb-files