【问题标题】:Move *.pdb file for static library without breaking references - LNK4099在不破坏引用的情况下移动静态库的 *.pdb 文件 - LNK4099
【发布时间】: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 提取了出现在我的警告中的一个目标文件 (&lt;someObjFromTheLib&gt;.obj)。我注意到提取的 *.obj 文件不包含 Debug$T 部分。

显然,当我将 *.pdb 文件从 &lt;libraryBuildDir&gt; 复制到我的项目时,我破坏了一些指向其他调试符号文件的链接,这些文件现在不再可用,因为我删除了 &lt;libraryBuildDir&gt;。这让我觉得我的整个过程都是错误的。

我的目标:用调试符号编译静态库,并将完成的 *lib 文件移动到另一个项目。然后编译另一个项目并包含来自静态库的完整调试符号。

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

(旁注:我正在使用 cmake 编译 Crypto++ v8.2.0,*.pdb 文件称为 cryptopp-object.pdb,而库称为 cryptopp-static.lib。这违反了 *.lib 和 *.pdb 的约定相同的名称,但它是 Crypto++ 的配置方式,如果可能,我不想更改它。但是,*.lib 文件似乎期望其 pdb 文件的名称正确,所以我认为这很好。)

(另外:lib /list &lt;myLib&gt;.lib 列出了很多 *.obj 文件,其中只有一些出现在我的 LNK4099 警告中,而其他则没有。我不知道这是否意味着它们根本没有在我的项目,或者如果他们有所有可用的调试信息。)

【问题讨论】:

  • 链接是从链接器包含文件夹完成的,pdb 在那里吗? pdb 和 lib 是否来自同一个“构建”?你在混合发布和调试版本吗?
  • 您可以使用 /Fd 编译选项将程序数据库放在您不打算删除的目录中。但是不删除该目录当然要容易得多。
  • @Robert Andrzejuk 是的,pdb 文件位于实际 lib 文件旁边的包含文件夹中。不,我确实首先编译了 lib 并从另一个构建中复制了 pdb,假设构建是确定性的并且每次都产生相同的输出(两者之间没有更改设置)。事实证明,如果我从完全相同的运行中重新编译并复制 lib 和 pdb,问题似乎就消失了。为什么结果不是确定性的?
  • 确定性是什么意思? lib 和 pdb 必须一起复制。

标签: c++ visual-studio pdb-files


【解决方案1】:

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

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

a) 因为 PDB 包含一个时间戳,并且该时间戳在不同的构建中很少会相同

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

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

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

只要 PDB 与构建匹配,它就应该是可能的。但是,请考虑构建到所需的目录 using the /Fd option for the PDB/Fo option for the OBJ

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2023-02-08
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2019-12-06
      相关资源
      最近更新 更多