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

Zac*_*Zac 16 c++ linker visual-studio-2010 visual-c++ pdb-files

我们已经在MSDN WRT上列出了这个错误(#5除外).不同机器上的三个不同的人正在遇到同样的问题.PDB已创建,但在中间某处失败.

细节:

  • 67个静态库
  • 4.27 GB的静态库
  • 1048575字节 - 链接器失败时PDB的大小
  • 最后几兆字节的PDB为空(零)
  • 发布版本成功并生成PDB(我们打开它,在exe中没有调试信息)
  • 发布版本PDB略低于1 GB.

我们已禁用病毒扫描程序.使用procmon.exe观察并且在链接器失败时没有看到与PDB的交互.

相关问题表明PDB的约1 GB限制 - 任何人/方式确认这一点?

更新和解决方案:

@Barry和铬团队提出了解决方案. 以下是实现解决方案的Chromium构建系统的补丁.

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

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

cl -c "dummy_empty.cpp" /Zi /Fd"$(TargetDir)$(TargetName).pdb" 
Run Code Online (Sandbox Code Playgroud)

原始解决方案
使用空cpp文件创建C++静态库项目,配置'Porgram数据库文件名'以输出除默认值之外的其他内容.使用一些项目构建事件(我使用'Pre-Link Event')将先前创建的PDB复制到链接器期望的任何位置(请参阅链接器 - >生成程序数据库文件)以创建其PDB.幸运的是,链接器将采用在PDB中复制并使用其4 kB页面大小.这将花费一些时间,一些空间允许高达2GB的PDB.

小智 7

1GBpdb大小确实存在最大限制.有一些技巧可以扩展到这里2GB(更多信息可以在这里找到).基本上你必须自己生成初始pdb文件而不是编译器.

您可以做的其他事情是对模板代码进行一些主动提升,因为这可能会影响您的pdb大小.


Zac*_*Zac 5

我把一个带有1000个cpp文件的测试程序放在一起,每个cpp有一个函数,它实例化了500个独特的模板类型.

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

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