在不中断引用的情况下移动静态库的 *.pdb 文件 - LNK4099

Move *.pdb file for static library without breaking references - LNK4099

本文关键字:pdb 文件 LNK4099 移动 中断 引用 情况下 静态      更新时间:2023-10-16

我在一个名为<libraryBuildDir>的文件夹中构建了第三方静态库,并将生成的 *.lib 文件复制到我的项目文件夹结构中。除了 *.lib,我还放置了 *.pdb 文件。然后我删除了<libraryBuildDir>,假设不再需要它。这是以前对其他库有效的方法,它遵循了似乎是常见的做法。

但是,当我在调试配置中构建项目时,我会收到许多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

我按照此建议提取了警告中出现的一个对象文件(<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警告中,而其他文件则没有。我不知道这是否意味着它们根本没有在我的项目中使用,或者它们是否具有所有可用的调试信息。

事实证明,如果我从完全相同的运行中重新编译并复制 lib 和 pdb,问题似乎消失了。

为什么结果不是确定性的?

a( 因为 PDB 包含一个时间戳,而该时间戳在不同的版本中很少相同

b( 因为现在的构建可以是多线程的,因此会导致不同的结果,具体取决于首先编译的内容。

c( "相同"的代码(关于行为(可能会产生不同的 AST,例如,如果您只是移动方法。

如何在不中断任何引用的情况下将 pdb 文件从临时库构建目录移动到另一个目录?

只要 PDB 与生成匹配,就应该可以。但是,请考虑使用 PDB 的/Fd 选项和 OBJ 的/Fo 选项构建到所需的目录中。

解决方案:构建不是确定性的。*.pdb 和 *.lib 文件必须来自完全相同的"构建"。