LNK1201 Visual c++ 2010大型项目无法生成PDB
LNK1201 Visual C++ 2010 Large project failing to generate PDB
我们已经通过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吗?
- 如何在大型c++项目的可视化代码中设置调试
- 为大型项目编写固件时应注意的注意事项
- 如何在 Eclipse 中链接大型C++项目
- 优点和缺点 在类内为大型项目定义的内联朋友助手免费函数
- makefile和错误将与大型项目分开的文件编译
- 在QT中的大型项目中指定构建/目标/安装路径
- 从Netbeans到Eclipse的大型C 项目的迁移
- 对于大型C/C++项目,在编译时使用GNU m4
- 如何使用x64编译器使用MsBuild.exe编译大型c++项目
- 使用GDB修复大型项目中的双自由或损坏(!prev)错误
- 确保每个标头在大型项目中使用唯一的包含保护
- 在大型C/C 项目中访问现有字段
- C 通过使用库来提高大型项目的构建速度
- 如何在大型项目中使用-fsplit -stack
- 大型项目C++例外
- 使用 C++11 std::元组在大型项目中
- 构建大型项目时,NDK构建会卡住/悬挂
- 如何在C++中处理大型项目
- 如何为大型项目制作一个简单的工具来检测Linux中的双倍空闲或内存溢出
- LNK1201 Visual c++ 2010大型项目无法生成PDB