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

标签 c++ visual-studio-2010 visual-c++ linker pdb-files

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

详情:

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

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

Related question建议对 PDB 进行约 1 GB 的限制 - 任何人/方式来确认?

更新和解决方案:

@Barry 和 Chromium 团队提出了解决方案。 Here是实现分辨率的 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++ 静态库项目,配置“Porgram 数据库文件名”以输出默认值以外的内容。使用一些项目构建事件(我使用“预链接事件”)将先前创建的 PDB 复制到链接器期望的任何位置(请参阅 Linker->Generate Program Database File )以创建其 PDB。幸运的是,链接器将采用 PDB 中的复制并使用其 4 kB 页面大小。这将花费一些时间和一些空间,最多允许 2GB PDB。

最佳答案

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

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

关于c++ - LNK1201 Visual C++ 2010 大型项目无法生成 PDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16308861/

相关文章:

c# - 使用linq过滤列表中的列表

c++ - 如何在 VC++ 2010 中将 stdext::hash_set 用于自定义类型?

c++ - 使用函数类型与函数指针作为 C++ 模板函数参数的区别?

c++ - 检查 vector 是否为二进制的快速而紧凑的方法

c++ - VS2010 : afxcw. lib(appcore.obj):错误 LNK2001:无法解析的外部符号 ___wargv

CreateFile 总是覆盖指定的文件

c++ - 声明数组时 VS2008 错误预期常量表达式,但 GCC 中此代码没有错误

visual-c++ - 在 Visual Studio 2013 中显示构建时间?

c++ - Clang 不编译代码,但 gcc 和 msvc 编译了它

C++ 为什么 "istringstream"在名称后使用括号?