【发布时间】:2013-05-16 20:28:47
【问题描述】:
我们正在大量使用boost::serialization 和一般模板。一切似乎都很顺利。
除了,我们在 Windows 版本中遇到了障碍。它似乎导致目标文件太大的问题。我们在 g++ 4.7.0 中使用 MinGW/Msys。
c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/as.exe: CMakeFiles/source.dir/sourcecode.cpp.obj: too many sections (33396)
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Assembler messages:
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Fatal error: can't write CMakeFiles/source.dir/sourcecode.cpp.obj: File too big
在其中,它表明另一个人碰到了几乎相同的障碍。它确实指向了 Visual Studio 的 /bigobj 选项的一个选项,该选项似乎可以满足我们的需要。但是,我们无法迁移到 Visual Studio。
一个建议是将 --hash-size 添加到汇编器选项中。这没有帮助。
如果我没记错的话,问题在于对象文件中的条目限制为 2^16 个。实际上,根据错误消息,我敢说这是一个签名的 2^16 条目,但那是花生。 Visual Studio 的 /bigobj 选项会将其更改为 2^32。邮件列表结果不知道 GCC 的等效选项。进一步的谷歌搜索结果似乎与此无关。
在这一点上,我们将不得不重构我们的代码(呃)以绕过这个限制。但我仍然担心,如果使用繁重的模板,我们可能会一次又一次地遇到这个问题(我们已经遇到了三个源文件)。
所以我的问题是这样的;是否有与 Microsoft 的 /bigobj 选项等效的 GCC?我还没有找到第三种选择吗?
【问题讨论】:
-
就个人而言,我很乐意。我必须了解当前正在使用的目标文件的格式。我必须想出一个新的格式。听起来像是一个很棒的个人项目。不幸的是,我的雇主不想承担这种责任。 :)
-
另一种可能性是目标文件打破了 2 GB 的障碍或类似的情况。您对导出符号的数量有多大把握?一些谷歌搜索表明 gcc 在 2^16 处没有硬障碍......你看过mingw-w64.sourceforge.net 吗?
-
@Yakk,在 g++ 运行汇编程序时巧妙地使用 ProcessMonitor 表明中间汇编程序文件(错误消息中的 ccnAocvD.s)大小约为 60MiB。然后它去创建目标文件(大概是为了确保它可以打开它)。几秒钟后,它退出并且错误消息显示在控制台上。我假设几秒钟是处理程序集文件并确定符号过多所需的时间。邮件列表中提到了 2GiB 屏障。我想确定那不是罪魁祸首。
-
@inetkght 如果您看这里,我们有人在测试 gcc 以查看它是否对该值有硬限制:gcc.gnu.org/ml/gcc-patches/2007-05/msg02104.html - 但那是在 07 年。您可能会考虑弄清楚如何使用当前编译器运行这些测试,这可能会找出问题所在。
-
这看起来可能会很有趣。谢谢!
标签: c++ visual-studio boost g++ mingw