提问人:lrineau 提问时间:2/27/2013 最后编辑:lrineau 更新时间:10/16/2021 访问量:25504
MSVS 编译器标志 /bigobj 的惩罚
Penalty of the MSVS compiler flag /bigobj
问:
基本的 Google 搜索 bigobj 问题表明,很多人都遇到了致命错误 C1128:“超出对象文件格式限制的部分数:使用 /bigobj 编译”。如果大量使用 C++ 模板库(如 Boost 库或 CGAL 库),则发生错误的机会更大。
这个错误很奇怪,因为它给自己提供了解决方案:设置编译器标志 /bigobj
!
所以这是我的问题:为什么没有默认设置该标志?使用该标志必须受到惩罚,否则将默认设置该标志。MSDN 中未记录该处罚。有人有线索吗?
我之所以问这个问题,是因为我想知道CGAL的配置系统是否应该默认设置。/bigobj
答:
54赞
Frédéric Hamidi
2/27/2013
#1
该文档确实提到了一个重要的缺点:/bigobj
在 Visual C++ 2005 之前提供的链接器无法读取 .obj 文件 是用 .
/bigobj
因此,默认情况下设置此选项将限制可以使用生成的对象文件的链接器数。最好根据需要激活它。
评论
2赞
Ela782
1/15/2018
在我看来,这只是答案的一部分。为什么 gcc 或 clang 不会出现此问题?它们是否具有类似于直接内置和始终在线的行为?/bigobj
2赞
mr NAE
2/20/2019
@Ela782,mingw 在处理大对象文件时也有同样的问题。在这种情况下需要设置。gcc 可能会创建更小的 .obj 或具有更大的大小限制。-Wa,-mbig-obj
0赞
simon.watts
3/12/2020
它是 PE-COFF 对象文件格式,它具有节表的 16 位索引,而不是整体对象大小。选项“kludges”将其转换为 32 位索引,但在 2005 年之前不支持。因此,GCC 工具链面临相同的限制,但可能会以不同的方式进行优化。在 MSVC 上使用字符串 de-dup (, ) 将每个字符串放在其自己的部分中,这可以显著增加部分表的大小。/bigobj
-Wa,-mbigobj
/GF
/O1
/O2
17赞
Jean-Michaël Celerier
4/18/2020
现在是 2020 年。2005 年与 1990 年和 2005 年发布时的今天相去甚远。2005 年的人们是否关心与 MS-DOS 6 时代链接器的兼容性?我非常怀疑。
6赞
Conrad Poelman
10/16/2021
#2
为什么默认情况下没有设置该标志?使用该标志必须受到惩罚,否则将默认设置该标志。
我的快速非正式实验表明,.obj 文件比没有 .obj 文件大约 2%。所以这是一个很小的惩罚,但不是零。/bigobj
有人提交了功能请求以设为默认值;请参阅 https://developercommunity.visualstudio.com/t/Enable-bigobj-by-default/1031214。/bigobj
评论