MSVS编译器标志/bigobj的惩罚

65
基本的谷歌搜索bigobj issue显示很多人遇到了Fatal Error C1128:“number of sections exceeded object file format limit : compile with /bigobj”这个错误。如果一个人在C++模板库中大量使用,例如Boost libraries或者CGAL libraries,那么这个错误出现的概率更高。

这个错误很奇怪,因为它给出了解决方案:设置编译器标志/bigobj

那么我的问题是:为什么这个标志不是默认设置的呢?一定有使用该标志的惩罚,否则它将被默认设置。MSDN上没有记录这个惩罚。有人有线索吗?

我提出这个问题是因为我想知道CGAL的配置系统是否应该默认设置/bigobj

2个回答

54
文档确实提到了使用 /bigobj 的一个重要缺点:

在 Visual C++ 2005 之前发布的链接器无法读取使用 /bigobj 生成的 .obj 文件。

因此,默认情况下设置此选项将限制可以使用生成的目标文件的链接器数量。最好根据需要激活它。

2
我觉得这只是答案的一部分。为什么gcc或clang不会出现这个问题?它们是否具有类似于/bigobj的行为直接内置并且始终打开? - Ela782
2
@Ela782,mingw在处理大型目标文件时也会遇到同样的问题。在这种情况下需要设置-Wa,-mbig-obj。可能是因为gcc创建了较小的.obj文件或者有更大的大小限制。 - mr NAE
它是PE-COFF对象文件格式,其具有对节表的16位索引,而不是整个对象大小。 /bigobj选项将其“欺骗”为32位索引,但在2005年之前不支持该选项。 GCC工具链面临相同的限制,因此使用-Wa,-mbigobj - 但可能会以不同的方式进行优化。 在MSVC中,使用字符串去重/GF/O1/O2)将每个字符串放在自己的部分中,这可以显着增加节表大小。 - simon.watts
17
我们现在是2020年。2005年距今的时间和1990年到2005年发布时的时间一样长。2005年的人是否关心与MS-DOS 6时代的链接器兼容性?我非常怀疑。 - Jean-Michaël Celerier

6
为什么默认情况下不设置标志?使用该标志必须有一定的惩罚,否则它将被默认设置。 我的快速非正式实验显示,与未使用该标志相比,.obj文件使用/bigobj会增加约2%的大小。因此,这只是一个小惩罚,但不是零。 有人提交了一个功能请求,希望将/bigobj设置为默认值,请参见https://developercommunity.visualstudio.com/t/ Enable-bigobj-by-default / 1031214

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接