10

我以前也发生过这种情况,但我不记得我是如何解决的。

我无法在新安装的 Ubuntu 上编译一些程序……我的标题有问题。

我试过 g++-4.1 和 4.3 无济于事。

g++ -g -frepo  -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include  -c qlisttest.cpp
/usr/include/libio.h:332: error: ‘size_t’ does not name a type
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope
/usr/include/libio.h:364: error: ‘size_t’ has not been declared
/usr/include/libio.h:373: error: ‘size_t’ has not been declared
/usr/include/libio.h:493: error: ‘size_t’ does not name a type
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared
...

文件...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
...



@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t
typedef __kernel_size_t    size_t;
typedef __kernel_ssize_t   ssize_t;

types.h 肯定在路径中,并且正在被拾取。我通过更改文件名进行了验证,并得到了一个错误,它丢失了......

有没有人有任何想法...?我真的很感激你的帮助......

4

6 回答 6

9

首先删除 -I/usr/include/linux 和 -I/usr/include。手动添加系统目录以包含路径要么无效,要么破坏事物。此外,删除 -frepo 以提高安全性。

于 2009-07-10T07:26:45.467 回答
4

如果没有看到您的完整来源,很难说问题出在哪里。调试此类问题的最佳方法是使用 g++ 的“-E”参数生成预处理器输出,然后查看它以找出包含的内容。以下是 g++ 信息页面关于“-E”的内容:

-E 预处理阶段后停止;不要正确运行编译器。输出采用预处理源代码的形式,发送到标准输出。

另外,为什么不在文件顶部包含 sys/types.h 呢?

附录:

在我的系统上,我创建了一个名为 foo.cc 的短文件,其中仅包含:

#include <time.h>

然后我跑了:

g++ -E /tmp/foo.cc > /tmp/foo.pp

详细查看此输出非常重要。例如,我了解到 /usr/include/bits/types.h 有一个用于 __time_t 的 typedef,然后 /usr/include/types.h 使用该 typedef 来表示“typedef __time_t time_t”。但是,围绕该定义还有其他有趣的宏。请特别注意 /usr/include/time.h 中的宏“__BEGIN_NAMESPACE_STD”之类的东西,在我的系统上它似乎是一个空定义。但是,我可以想象其他一些系统可能对这个宏有不同的值,迫使 time_t 的定义进入其他命名空间。

阅读 Cpp 信息页面,定义文件行格式的“9 预处理器输出”部分。特别值得注意的是以下部分:

源文件名和行号信息由表格的行传达

# LINENUM 文件名标志

然后继续描述对这个级别的调试感兴趣的“FLAGS”。

于 2009-07-10T06:17:41.940 回答
4

通常,您不应该将 C .h 文件用于 C++。虽然您可能会找到一种简单的方法来摆脱它,并且在以前版本的 g++ 和其他编译器中允许这样做很多,但 C++ 标准将 size_t 定义为 cstddef(参见第 18.2 节/表 17)。g++ 只会变得越来越严格。

删除您添加到命令中的所有包含路径(它们是多余的),如果不包含,则添加到源代码的顶部:

#include <cstddef>
using namespace std;
于 2009-07-10T06:57:27.867 回答
3

您是否安装了 build-essential 软件包?

sudo apt-get install build-essential
于 2009-07-10T16:59:36.247 回答
3

忘记跟进这个了。事实证明,/usr/include不能包含/usr/include/linux在这个特定的发行版中。size_t似乎被第二个包括消灭了。

我的包含现在只是/usr/include并且效果很好。

-I/usr/include -I/usr/include/ace -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0...

拉出所有包含并与它们一起玩修复它。

于 2009-07-18T17:30:23.960 回答
1

它应该在 stddef.h 或 cstddef 中。types.h 不是标准库,我相信它指的是操作系统需要的类型。

于 2009-07-10T17:34:35.443 回答