【发布时间】:2012-05-17 17:19:37
【问题描述】:
我在 x64_86 GNU linux 架构上使用 g++ 版本 4.1.2。代码库非常庞大,我对项目中使用的 makefile 没有足够的了解。代码可以正常编译。
出于某些调试目的,我需要单独预处理 (g++ -E) 几个源文件,然后重新编译它。我正在使用-I 提供所需的包含路径。理想情况下,编译应该没问题。
但我在标准标题中发现了一些差异,例如:
-
typedef unsigned long size_t;导致operator new()出现错误 编译器生成的声明(如果我更改为unsigned int手动然后此错误消失) - 在
unsigned long numeric_limits<>::max()等库函数中, 编译器抱怨大数字,例如922...807L;它产生 编译器错误为integer constant is too large for long type -
__errorno_location()的不匹配声明导致编译器错误
我很难找出问题所在。为什么当我在未更改的文件上进行编译时编译正常,为什么当我在单个文件上提供 g++ -I <> -E 选项时标准标题开始乱写?
(请注意,我们编写的代码没有问题,它只是来自标准库方面。我尝试将具有unsigned int 的stddef.h 定位为typedef,但这只是解决了第一个问题。)
任何解决此错误的想法都将受到高度赞赏。
【问题讨论】:
-
您能看到/找到用于构建目标文件的确切编译器命令行吗?包含路径并不那么重要(预处理只会失败),其他选项可能是。 (只是猜测。)
-
也许您可以发布一个小示例文件(您似乎只需要使用
size_t和new的东西 - 但我不太确定)以及确切的命令行(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