【问题标题】:g++ compilation of a separately preprocessed file gives error depending on the architectureg++ 编译单独预处理的文件会根据架构产生错误
【发布时间】:2012-05-17 17:19:37
【问题描述】:

我在 x64_86 GNU linux 架构上使用 g++ 版本 4.1.2。代码库非常庞大,我对项目中使用的 makefile 没有足够的了解。代码可以正常编译。

出于某些调试目的,我需要单独预处理 (g++ -E) 几个源文件,然后重新编译它。我正在使用-I 提供所需的包含路径。理想情况下,编译应该没问题。

但我在标准标题中发现了一些差异,例如:

  1. typedef unsigned long size_t; 导致 operator new() 出现错误 编译器生成的声明(如果我更改为unsigned int 手动然后此错误消失)
  2. unsigned long numeric_limits<>::max() 等库函数中, 编译器抱怨大数字,例如922...807L;它产生 编译器错误为integer constant is too large for long type
  3. __errorno_location() 的不匹配声明导致编译器错误

我很难找出问题所在。为什么当我在未更改的文件上进行编译时编译正常,为什么当我在单个文件上提供 g++ -I <> -E 选项时标准标题开始乱写?

(请注意,我们编写的代码没有问题,它只是来自标准库方面。我尝试将具有unsigned intstddef.h 定位为typedef,但这只是解决了第一个问题。)

任何解决此错误的想法都将受到高度赞赏。

【问题讨论】:

  • 您能看到/找到用于构建目标文件的确切编译器命令行吗?包含路径并不那么重要(预处理只会失败),其他选项可能是。 (只是猜测。)
  • 也许您可以发布一个小示例文件(您似乎只需要使用 size_tnew 的东西 - 但我不太确定)以及确切的命令行(s) 涉及。我确实不清楚你在做什么。
  • “标准标题开始抄袭”是什么意思?
  • @Mat,在这种情况下,包含路径会产生影响;假设我正在处理一个像A/B/C/x.cpp 这样的文件,那么我需要在x.cpp 中找到所有#include 的依赖项。无论如何,我使用g++ -E 对文件进行单独的预处理。对于一般用途,我们必须使用make;我应该发布什么命令? (我们在bash 文件中做了一些source,在make 之前)
  • @MichaelBurr,standard header cribbing,我的意思是问题出现在标准定义中,如operator new (size_t) 以及我在代码示例中提到的任何内容。我们的代码没有问题。因此,似乎在预处理文件时,我可能包含错误的目录。你到底想让我发布什么部分,因为示例文件本身会非常大。

标签: c++ architecture compiler-errors g++ standard-library


【解决方案1】:

不要单独预处理和编译,或者如果您必须使用一致的编译器选项和一致的环境。

听起来你是在 32 位机器上运行预处理器(或使用 -m32 选项)然后在 64 位机器上编译。

【讨论】:

  • 在我的情况下需要不同的预处理来进行一些调试。接受您对 -m32 的回答,这是我的问题中出现 1 和 2 错误的根本原因。
【解决方案2】:

编译预处理器的输出时,请确保使用-fpreprocessed 编译器选项,这样预处理器就不会再次运行。

如果您不传入该选项,某些生成看起来像宏的标识符的构造可能会再次扩展为不应扩展的内容。我很难想出一个显示不同的案例(我相信我可以,但这需要一些令人费解的事情并且会非常做作)。但是,实现标头可能会使用一些可能对此选项敏感的神秘宏技术。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2012-01-31
    • 2017-11-15
    相关资源
    最近更新 更多