使用 Visual Studio 可用工具重命名 pdb 文件?

Posted

技术标签:

【中文标题】使用 Visual Studio 可用工具重命名 pdb 文件?【英文标题】:Rename pdb file with visual studio available tools? 【发布时间】:2017-07-07 07:37:29 【问题描述】:

我们构建但通常以任何方式修改的第三方软件有一些奇怪的行为:由于它是作为静态库构建的,它创建的 PDB 文件称为 vc.pdb 和位于软件的中间文件夹中。现在它创建了大约 12 个 pdb 文件,它们都在不同的文件夹中,对于不同的库和不同的配置都具有相同的名称。

当我们将此第三方软件集成到我们的代码中时,我们会收到 LNK4099 警告,因为 pdb 的烘焙路径显然并非在所有机器上都存在。由于第三方软件会在一个输出目录中生成多个 .lib 文件,因此我们无法将 vc<...>.pdb 文件与它们一起放置。

所以我正在寻找一种方法来修补以 pdb 名称烘焙的 lib 文件,使其成为我可以控制的东西。 Visual Studio 构建工具是否提供了这样做的方法?

编辑:让我更详细地解释一下我们在做什么: 我们决定在我们的项目中集成一些第三方静态库。该项目本身作为源包提供。一个开发人员或构建服务器或构建此源程序包的任何人,它在各种构建配置中生成称为 a.lib 和 b.lib 的静态链接库。使用它们,默认的 Visual Studio 配置会生成 vc110.pdb 文件,因为它们被称为所有相同的 VS 自动将它们放入 $(IntDir)。所以 pdb 文件到处都是。 现在我们将这些第三方二进制文件提交给给定项目 X 的​​ VCS。 现在在项目 X 中使用静态库的人必须将它们链接到最终的二进制文件中。这是生成 LNK4099 的时间,因为 pdb 文件不在 VCS 中并且在此计算机上不可用。

但是我们实际上不能提交所有的 vc110.pdb 文件,因为这是没有用的。由于完全限定的路径被构建到静态库中,因此没有其他用户能够复制它。在链接到 PDB 的完整路径期间无法找到,因此它会在 lib 文件的位置查找 vc110.pdb。 由于第三方包决定将 a.lib 和 b.lib 放在同一个目录中,我们永远无法将 pdb 文件与它们一起正确放置,除非我们修改第三方包的构建并重命名 vcxproj 中的 pdb 文件或将库的生成拆分到不同的目录中(也在 vcxproj 中)。

这就是重点:我希望随时修改第三方的构建文件,我希望能够使用该第三方包的全新下载并构建它带有一些“简单”的批处理脚本。 这个包的默认结果是:

/Bin
    /Debug
        a.lib
        b.lib
    /Release
        a.lib
        b.lib
/Temp
    /A
        /Debug
            vc110.pdb
        /Release
            vc110.pdb
    /B
        /Debug
            vc110.pdb
        /Release
            vc110.pdb

我真正想要的是在构建之后修补生成的文件。 例如,我的“简单”批处理(或其他)脚本可以将 pdb 文件重命名为 a.pdb 和 b.pdb,这当然是不够的,因为链接器仍会查找 vc110.pdb,因为它是已编译的姓名。这就是为什么我正在寻找一种方法(通过 lib 或 dumpbin 等工具),我可以将生成的库修补到新的 pdb 名称。

这样:

$ magic /showPDB a.lib
> D:\some_users_machine\unique_path\package\Temp\A\Debug.vc110.pdb

$ magic /newPDB a.lib d:\path\a.pdb
> New PDB name is d:\path\a.pdb

当消费者随后链接我修补的 a.lib 时,它不会尝试在上面的路径中查找 a.pdb。它当然也不会在大多数机器上找到,但链接器也会在 a.lib 所在的位置查找 a.pdb,我现在可以将它放置在所有机器上。

编辑 2:由于意见基础而关闭:我正在寻找一种技术方法来修改在 pdb 位置烘焙的静态库

【问题讨论】:

嗯,以这种方式工作非常重要。 final pdb 文件需要匹配可执行文件(dll 或 exe)。但是当你使用一个静态库项目时,这必须推迟,直到库被链接,踏板才会与金属接触。此时,vcxyz.pdb 文件中的调试条目被合并以生成最后一个。当生成链接器警告时,您显然做错了什么,您不知道那可能是什么。首先专注于为 one 配置正确设置,其余的可以等待。 @HansPassant 我更新了原始帖子以澄清我在做什么。 【参考方案1】:

查看链接器选项 /PDBALTPATH。这允许您指定将嵌入到二进制文件中的不同 PDB 路径。

/PDBALTPATH:pdb_file_name 

MSDN Article: /PDBALTPATH (Use Alternate PDB Path)

【讨论】:

感谢您的回复。然而,我的问题在于构建后的情况。我没有构建静态库,因此我无法在它们上设置任何 /PDBALTPATH,因为它们不是由我维护的,我正在寻找一种方法来修改它们的 pdb 路径。 /PDBALTPATH 实际上是在您的二进制文件的链接时设置的。但它可能不会做您想要的,即更改静态库的 PDB 名称。您可以使用 LIB /EXTRACT 提取库,然后手动编辑路径,但我不确定这是否可行,因为我还没有这样做。

以上是关于使用 Visual Studio 可用工具重命名 pdb 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio:自动重命名项目(和目录)的工具

Visual Studio 2010:如何重新映射 F2 以重命名文件而不是打开对象浏览器

Visual Studio:重命名变量时的快捷方式

重命名 Visual Studio 2008 MFC 项目后出现 R6034 运行时错误

如何在 Visual Studio 中重命名方法并保留历史记录?

Visual Studio 2015和2017 - 仅使用一个快捷方式应用重命名