【问题标题】:Build issue with MSVS 2010 and the C++ standardMSVS 2010 和 C++ 标准的构建问题
【发布时间】:2023-03-07 10:37:02
【问题描述】:

我正在尝试使用 msvs 2010 构建在以下 git 中找到的项目:

https://github.com/Joonhwan/exprtk

问题是当我在 exprtk.hpp 文件中注释掉第 48 行“#define exprtk_lean_and_mean”时,我收到以下编译器错误:

Error   1   error C1128: number of sections exceeded object file format limit : compile with /bigobj

谷歌搜索错误,似乎表明已编译的翻译单元已编译为大于任意限制的内容,并且将“bigobj”添加到命令行应该可以解决问题(确实如此)。使用 gcc (4.3) 编译代码,没有故障。

我的问题是:

  1. c++ 是否对翻译单元中可以拥有的类型数量进行了限制?

  2. 这个项目中代码的布局方式是不好的做法吗? (谷歌搜索时,我注意到很多 boost 库都有同样的问题,例如:Boost.Sprit)

【问题讨论】:

    标签: c++ visual-c++ compiler-errors standards


    【解决方案1】:

    c++ 是否对翻译单元中可以拥有的类型数量有限制?

    请注意,这些参数的最大值对于特定的实现是开放的。该标准仅强制实施必须支持的最低要求。实现将记录它支持的最大值,在这种情况下,MSVC 实现会这样做。

    这些是在 C++ 标准的一个特殊部分中定义的。

    附件 B - 实施数量

    1. 由于计算机是有限的,C++ 实现不可避免地受到限制 在程序的大小上,他们可以 成功处理。 每个 实施应记录那些 已知的限制。 这 文件可能会引用固定限制 它们存在的地方,说明如何计算 作为函数的可变限制 可用资源,或者说固定 限制不存在或未知。

    2. 这些限制可能会限制数量,包括以下描述的数量或 其他。 括号中的数字如下 每个数量被推荐为 该数量的最小值。但是, 这些数量仅供参考 并且不确定合规性。
      — 复合语句的嵌套级别, 迭代控制结构,以及 选择控制结构 [256].
      — 条件嵌套级别 包含[256]。
      — 指针、数组和 函数声明符(在任何 组合)修改算术, 结构、联合或不完整类型 在声明中[256]。
      — 嵌套 括号表达式的级别 在完整的表达式中[256]。
      — 内部字符数 标识符或宏名称 [1 024]。
      — 外部字符数 标识符 [1 024]。
      — 外部 一个翻译单元中的标识符 [65 536]。
      — 带有块的标识符 在一个块中声明的范围 [1 024]。
      — 宏标识符同时 在一个翻译单元中定义 [65 536]。
      — 一个函数中的参数 定义[256]。
      — 参数合二为一 函数调用 [256].**
      — 中的参数 一个宏定义[256]。
      — 一个宏调用中的参数 [256]。
      — 一个逻辑中的字符 源代码行 [65 536]。
      — 中的字符 字符串文字或宽 字符串文字(连接后) [65 536]。
      对象的大小 [262 144]
      — #include 的嵌套级别 文件 [256]。
      - 案例标签 switch 语句(不包括那些 任何嵌套的 switch 语句)[16 384]。
      — 单个数据成员 类、结构或联合 [16 384]。
      — 枚举常量 枚举[4 096]。
      — 级别 嵌套类、结构或联合 单一的定义 结构声明列表 [256]。
      — atexit()[32] 注册的函数。
      — 直接和间接基类 [16 384]。
      — a 的直接基类 单类[1024]。
      — 会员 在单个类中声明 [4 096]。
      — 最终覆盖虚函数 一类,可访问或不可访问 [16 384]。
      — 直接和间接虚拟基地 类 [1 024]。
      — a 的静态成员 类 [1 024]。
      — 朋友声明 在一类[4 096]。
      — 访问控制 类中的声明 [4 096]。
      — 构造函数中的成员初始化器 定义[6 144]。
      — 范围 一个标识符的资格 [256]。
      — 嵌套外部 规范 [1 024]。
      — 模板 模板声明中的参数 [1 024]。
      — 递归嵌套模板 实例化[17]。
      — 每个处理程序 尝试块 [256]。
      — 投掷 单一功能的规格 声明 [256]。

    【讨论】:

    • 方括号中的这些最小值,因为它们是“推荐”的,因此不能用作定义编译器是否符合标准的最小值 - 这是正确的吗?
    • @GellyRistor:是的,确实如此。但是大多数符合主流标准的编译器至少会支持这些最低要求,而且确实如此。
    • 还有一个问题,鉴于上面的列表,其中哪一个定义了 msvc 2010 编译器抱怨的“部分”的推荐数量?
    • @GellyRistor:我认为这可能是二进制对象的大小,所以我把它加粗了,但它可能是一些其他值,比如范围内的标识符数量。我不确定因此发布了整个列表。
    • @GellyRistor:可能是“一个翻译单元中的外部标识符”,结合 MSVS 的“编辑并继续”选项。该选项将每个功能都放在自己的部分中,以便于更换。
    【解决方案2】:

    限制在于旧版本的 MSVC 和相应链接器使用的 OBJ 格式。因此,虽然这个限制是任意的,但它不能成为新版本编译器的默认行为。查看/bigobj 选项的说明:

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

    【讨论】:

    • 而且由于您使用的是 C++(不是 C),因此混合来自多个不同 Visual Studio 版本的编译代码无论如何都不太可能工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2012-05-20
    相关资源
    最近更新 更多