【问题标题】:Huge OBJ files in VS2008 C++ compilation compared with VS6VS2008 C++ 编译中的巨大 OBJ 文件与 VS6 相比
【发布时间】:2012-07-12 12:11:53
【问题描述】:

我们有一个大型项目,大约 300 个 DLL 中 > 100 万行代码。 到目前为止,我们一直在使用 VS6。

我现在已将所有内容转换为 VS2008,所有编译、链接,更重要的是 - 运行!

==>但是...生成的编译后的 OBJ 文件要大 10 倍,而且链接速度非常慢,链接器经常会达到 >1GB 的内存。

部分含义是我需要使用 /bigobj 编译某些项目。

结果是从桌面上的大约 1:45 到 3 小时的构建。 DLL 和 LIB 的大小与旧 VS6 版本中的大小大致相同。

我已经阅读了所有可以在这里找到的内容,但没有找到解决此问题的方法。 如果它是额外的调试信息 - 我不想要它。我以前受够了。 发布的大小增加了,但没有那么多......

有人知道吗?还是我唯一的选择是将项目分解成更小的单元?重构是我唯一的希望吗?!当然,我错过了一个秘密标志......


Edit1(13/07/2012 12:20BST) 我比较了 VS6 与 VS2008 创建的 Obj 的垃圾箱。 2008 年的那个出现好像“静态链接”。在 VS6 中,它包含一些来自当前 DLL 的符号。在 VS2008 中,它包含来自(可能)它所依赖的所有库的符号。 VS6 和 VS2008 的垃圾箱大小分别为 66kb 和 32,000kb。

【问题讨论】:

  • 尝试在项目设置(C++ 分支)中禁用“调试信息”。
  • “我们有一个大型项目,>1M 行代码,大约 300 个 DLL。到目前为止,我们一直在使用 VS6。” 我永远不会抱怨又是我的工作了。
  • @IvanShcherbakov - 这不会妨碍我轻松调试吗?
  • 顺便说一句,这里的 Xoreax Incredibuild 客户很满意。我们在现场有一些大型构建服务器;超过 90% 的构建被卸载给他们。
  • @MSalters - 我们尝试了 incredibuild,但不幸的是我们并不满意。最初,这是我的首选方法。此外,由于链接是最大的瓶颈 - Incredibuild 无法解决这个问题。

标签: c++ visual-studio-2008 object size


【解决方案1】:

检查您的调试选项。 /Z7 导致大的 .OBJ 文件,/Zi 将相同的信息放在单独的 .PDB 文件中。

编译器选项/Oi 可以通过内联内在函数来提供帮助,这样就不再需要链接了。你可能不想调试memset

关闭/Gm(增量重建),以便您可以打开/MP(并行构建)。还要关闭/Gy - 虽然它可以生成更小的 EXE,但它会导致更大的 OBJ 文件和更慢的链接。

【讨论】:

  • 感谢@MSalters。我们使用 /ZI。我们使用/MP,GY关闭。我还玩了增量与非增量链接。非增量是痛苦的。非常。现在添加 /Oi - 将在 12 小时内报告
  • 增量链接内存不足,我找不到解决方法。对象大小减少了大约 25%,但它们仍然很大。我不能使用 /3GB 标志,因为许多开发人员 (erm) 使用总容量为 3GB 的笔记本电脑...我会尝试更改操作系统,因为我有 XP...
  • /3GB 标志是指构建的可执行文件的地址空间,不会影响编译器或链接器本身。此外,这是 3GB 地址空间,其中包括内存映射文件,而不是 RAM。
  • 我添加了一些新信息,如果这更有意义的话......谢谢!
  • 有道理,但你能检查一下你有什么 type 符号吗?听起来大多数都是“UNDEF”。此外,摘要应该告诉您 .OBJ 的哪些部分对其大小有影响。那是.debug$S.debug$T 部分吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多