目标文件的节太多

问题描述 投票:36回答:5

通常,我们大量使用boost :: serialization和模板。似乎一切都很好。

除了,我们在Windows版本中遇到了障碍。似乎导致目标文件太大的问题。我们将MinGW / Msys与g ++ 4.7.0结合使用。

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

Google大师透露了此已归档的消息,http://sourceforge.net/mailarchive/forum.php?thread_name=CA%2Bsc5mkLvj%3DW9w2%3DsY%3Dc_N%3DEwnsQuPDEX%3DiBcbsbxS3CuE_5Bg%40mail.gmail.com&forum_name=mingw-users

其中表示另一个人几乎击中了相同的障碍物。它确实指向了Visual Studio的/bigobj选项,该选项似乎可以满足我们的需要。但是,我们无法移至Visual Studio。

一个建议是将--hash-size添加到汇编器选项。这没有帮助。

如果我没记错的话,问题在于目标文件中的条目限制为2 ^ 16。实际上,根据错误消息,我敢冒险说这是一个签名的2 ^ 16条目,但这是花生。 Visual Studio的/bigobj选项会将其更改为2 ^ 32。邮件列表结果不知道gcc的等效选项。 Google的其他搜索结果似乎与此无关。

此时,我们必须重构代码(ugh)来克服此限制。但是我仍然担心,通过大量的模板,我们可能会一次又一次地遇到问题(我们已经使用三个源文件来解决它)。

所以我的问题是这样;是否有与Microsoft的/bigobj选项等效的gcc?我还找不到第三种选择吗?

c++ visual-studio boost g++ mingw
5个回答
47
投票

解决方案是,如果您的GCC版本支持该选项,则添加选项-Wa,-mbig-obj。您可能只在编译步骤中需要它,而在链接器步骤中则不需要。

如果编译器不支持该选项,则应使用mingw-w64和MSYS2


10
投票

错误"%B: too many sections (%d)"来自coff_compute_section_file_positions()中的功能bfd/coffcode.h。当输出.obj文件(COFF格式)包含超过32766个节时,将生成该文件。无法避免此错误,至少如果要使用Windows的PE / COFF对象格式,则无法避免。 COFF文件仅将两个字节用于文件头中的“ NumberOfSections”。

[我不清楚as(GNU汇编程序)为什么将段数的上限设置为32768--2,而不是65536--1(保留第0节);但是无论哪种方式,如果您大量使用模板编译器通过COMDAT部分实现模板,那可能还不够。

[您已经注意到,将/bigobj传递给Microsoft的编译器会导致它输出带有最多2 31节的模糊COFF格式,“对于任何人来说都足够”。但是,这种杂乱无章的格式尚未正式记录下来,而且我看不到任何有关该主题的非正式文件(博客文章或您拥有什么),因此在拥有MSVC副本的人可以撰写/bigobj规范之前,进入GNU工具的机会不大。

恕我直言,如果您要构建Windows版本,则应该硬着头皮使用MSVC。除了Microsoft,没有人特别愿意浪费时间来使用PE / COFF格式。


4
投票

[当我用MinGW-w64编译Poco库时遇到了同样的问题,结果发现调试对象对于一个实现文件来说是巨大的。

当您mentioned before时,您可以分割cpp文件,它可以工作,但是当您面对某人的源代码时,您不能不破坏某些内容而这样做。

作为一种解决方案,您可以打开编译器优化:从-O1到-O3,每一步都将构建更小的目标文件,它可以解决问题,在我的情况下可以做到。是的,对于调试版本,you can try -Og也是不可取的


4
投票

我在此问题上发现了一些更新,它似乎已在x64窗口的新binutils中修复,请参见https://sourceware.org/ml/binutils/2014-03/msg00114.htmlhttp://sourceforge.net/p/mingw-w64/bugs/341/。但是,我没有测试它,因为此修复不适用于我需要的32位版本。


0
投票

您可以通过添加编译标志-flto -Wl,-allow-multiple-definition来添加-fuse-linker-plugin-Wa,-mbig-obj不适用于x86 / 32位架构(仅x64)

© www.soinside.com 2019 - 2024. All rights reserved.