Visual C++ 2010 中大型项目生成 PDB 文件失败,错误代码为 LNK1201

17
我们已经查看了MSDN上关于此错误的列表(除了#5)。三个不同的人在不同的机器上遇到了相同的问题。PDB文件被创建了,但是在中途失败了。
细节如下:
  • 67个静态库
  • 4.27 GB的静态库
  • 链接器失败时PDB大小为1048575字节
  • PDB的最后几兆是空的(全是零)
  • 发布版本构建成功并生成了PDB(我们已经开启了它,但是在exe中没有调试信息)
  • 发布版本的PDB大小略小于1 GB。
我们已经禁用了病毒扫描器。使用procmon.exe观察时,在链接器失败时未发现与PDB有关的可疑交互。 Related question建议PDB的大小限制为约1 GB-是否有任何方法可以确认? 更新和解决方案:

@Barry和Chromium团队想出了解决方案。 这里 是实现该解决方案的Chromium构建系统的补丁。

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

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

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

原始解决方案
创建一个空的 cpp 文件的 C++ 静态库项目,将“程序数据库文件名称”配置为输出其他内容而不是默认值。使用一些项目构建事件(我使用了“预链接事件”)将之前创建的 PDB 复制到连接器期望的任何位置(请参见连接器->生成程序数据库文件),以创建其 PDB。幸运的是,连接器将采用复制的 PDB 并使用其 4KB 页面大小。这将节省一些时间和空间,允许最多2GB的PDB。


增量构建已知会引起这些问题。在清理后进行完整重建时是否会发生这种情况? - Alois Kraus
是的,这发生在构建和重新构建时。我相信增量链接已关闭,但我们正在进行双重检查。 - Zac
3个回答

8

实际上,pdb大小的最大限制是1GB。 有一些技巧可以将其扩展到2GB(有关更多信息,请参见此处)。基本上,您需要自己生成初始pdb文件而不是编译器。

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


在 Chromium 中与此相关的更改集链接:https://chromium.googlesource.com/experimental/external/gyp/+/9ee1e40e50f3148f691965a0829709f0d25b0412 - Michalis Giannakidis

5
我编写了一个测试程序,包含1000个cpp文件,每个文件都有一个函数,并实例化了500种不同的模板类型。
当PDB文件达到1048575 KB时,Link.exe失败了。
看起来在PDB格式或LINK.exe中存在1 GB的某种硬限制。

0

你尝试过减少并行构建的数量吗?在IDE中有一个设置。在VC9中,我们遇到了类似的问题,我们唯一的解决方案是减少本地构建的数量。这可能也是内存问题吗?你正在使用VC 10 SP1吗?


一切编译都很顺利 - 所以我不确定为什么执行/MP编译会产生影响。我们担心链接器内存不足,这是一个32位构建(32位linker.exe)。我们正在使用SP1。 - Zac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接