LNK1201 Visual c++ 2010大型项目无法生成PDB

LNK1201 Visual C++ 2010 Large project failing to generate PDB

本文关键字:PDB 大型项目 Visual c++ 2010 LNK1201      更新时间:2023-10-16

我们已经通过MSDN WRT上列出的点来解决这个错误(除了#5)。三个人在不同的机器上遇到同样的问题。PDB创建成功,但中途失败。

细节:

    67个静态库4.27 GB静态库
  • 1048575字节-当连接器失效时PDB的大小
  • PDB的最后几兆字节为空(零)
  • 发布构建成功&生成一个PDB(我们打开了它,在exe中没有调试信息)
  • 发布版本PDB不到1gb。

我们已禁用病毒扫描程序。查看procmon.exe,当链接器失败时,没有发现与PDB的可疑交互。

相关问题建议~1 GB的PDB限制-有人/方式确认吗?

更新,解决方案:

@Barry和chromium团队已经提出了解决方案。下面是Chromium构建系统的补丁,它实现了这个解决方案。


PDB在内部使用虚拟文件系统:MSF。当链接器创建PDB文件时,它的默认页面大小为2kb(显然是不可配置的)。显然,幸运的是,当编译器创建它的PDB时,它将页面大小默认为4 kB。该编译器PDB可以被提升并用作链接器PDB的基础。

更好的解决方案作为项目上的预链接事件,我们可以提升编译器以生成所需的初始PDB:

cl -c "dummy_empty.cpp" /Zi /Fd"$(TargetDir)$(TargetName).pdb" 

原始解决方案
用一个空的cpp文件创建一个c++静态库项目,配置"程序数据库文件名"以输出默认值以外的内容。使用一些项目构建事件(我使用'Pre-Link Event')将先前创建的PDB复制到您链接器期望的任何地方(参见链接器->生成程序数据库文件)以创建其PDB。幸运的是,链接器将采用复制的PDB,并使用它的4 kB页面大小。这将节省一些时间和一些空间,最多允许2GB的PDB。

对于pdb大小确实存在1GB的最大限制。有一些技巧可以将其扩展到2GB(关于这一点的更多信息可以在这里找到)。基本上,您必须自己生成初始pdb文件,而不是编译器。

你可以做的其他事情是在你的模板代码上做一些主动提升,因为这也可能影响你的pdb大小

我用1000个cpp文件组合了一个测试程序,每个cpp文件有一个函数,实例化了500个唯一的模板类型。

当PDB文件达到:1048575 KB时,Link.exe失败。

在PDB格式或LINK.exe中似乎是某种硬限制在1 GB。

您是否尝试过减少并行构建的数量?IDE中的某个设置。在VC9上,我们遇到了类似的问题,我们唯一的解决方案是减少本地构建的数量。这也可能是记忆问题吗?您使用的是vc10 SP1吗?