【问题标题】:Detect building with symbols in preprocessor on Windows在 Windows 上使用预处理器中的符号检测构建
【发布时间】:2014-04-25 18:05:37
【问题描述】:

是否有任何方法可以检测编译器何时启用了预处理器的调试符号? (使用 cl.exe 时)

(背景:由于工具链 .pdb 大小限制,我们的编译将失败,所以我想早点 #error 而不是在长时间构建后编译/链接失败。)

【问题讨论】:

  • 为什么您的工具链会关心外部 PDB 文件的大小?这难道不是您应该寻求解决的更严重的问题吗?我的意思是,如果您没有可用的符号,您将如何有效地调试您的应用程序?
  • PDB > 1G时VS工具链失效。是的,这是一个严重而复杂的问题。我只是希望在漫长的构建中更早地进行诊断。
  • 有趣,我以前没有遇到过这个限制。那么,是时候将代码拆分成一些 DLL 了吗?特别是因为我认为您的问题没有答案。它可能会帮助您处理您肯定会遇到的荒谬链接时间。我还发现了这个可能的解决方法:LNK1201 Visual C++ 2010 Large project failing to generate PDB。这应该为您的 PDB 文件提供总共 2 GB 的空间,这应该可以让您完成这些 DLL。
  • 再次感谢。这就是我们在 VS2010 下所做的(我在 codereview.chromium.org/11968015 中为 Chromium 实现了该 hack,chrisha 的概括,SO 帖子所基于的!)。但遗憾的是,它导致 mspdbsrv 在 VS2013 上非常不稳定(经常崩溃)。当然,我为这些提交了连接错误,但是......不是快速周转。

标签: c++ windows c-preprocessor debug-symbols


【解决方案1】:

当您为 cl.exe 构建命令行时,如果您决定传递 /Zi(或您用于生成 pdb 的任何选项),也要传递 -D_SYMBOLS_GENERATED。然后,在代码中,只需使用#if defined(_SYMBOLS_GENERATED)

【讨论】:

  • 只是为了更新xkcd.com/979,我确认在 VS2013 Update 2 中 PDB 大小限制从 1G 提高到 4G。目前我们最大的是“只有”2.1G,所以……我认为这个问题永远解决了。 “但是怎么办——”。压缩它!为了。永远。
【解决方案2】:

我能想到的最简单的是:

#ifdef _DEBUG
    #error "no debug builds, sorry"
#endif

可以定义 _DEBUG 但不创建 .pdbs,但不知何故我怀疑你们这样做。

预处理器参考可在http://msdn.microsoft.com/en-us/library/y4skk93w.aspx 获得

【讨论】:

  • 谢谢,但是是的,我们将“调试”与“符号”分开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2014-01-17
  • 2016-09-11
  • 2016-02-16
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
相关资源
最近更新 更多