2010-05-22 48 views
1
编译netcat的

我一直在试图收集关于AIX netcat.c一段时间(使用命令make aix),但编译器给了我一些奇怪的反馈,如:在AIX上

“netcat.c”,行117.12:1506-275(S)遇到意外的文本'int'。

在117线检查文件netcat.c的时候,我会发现行(代码下面第二行):

#ifdef HAVE_BIND 
extern int h_errno; 
/* stolen almost wholesale from bsd herror.c */ 

即使我改变了INT成char在相同的测试,节省该文件并重新运行该命令我得到相同的错误

我错过了在阅读错误代码的东西吗?

+0

好的,我现在在线寻找gcc来安装在我的机器上,并尝试用它代替cc编译代码。 – 2010-05-22 11:06:40

+1

@ A.Rashad,cc可能是OS附带的脑死亡编译器,或者是通向xlc的链接。我认为gcc _is_可能是最好的选择,特别是如果你想构建所有的FOSS/Linux-y工具。 – paxdiablo 2010-05-22 11:14:12

回答

3

如果您使用xlc(尤其是老年人),它通常由声明语句后引起的,是这样的:

i = i + 1; 
int x; 

你可能需要给我们多一点的情况下,如10个左右错误行之前的行。

如果您的使用较旧的xlc,我的建议是将gcc运行在该框上。 IBM现在制作了一些优秀的编译器,但是早期的编译器并没有如此热门(在我看来)。

+0

它确实在代码中间有声明。 我应该重新考虑在每个函数的开头定义它们并再试一次吗? – 2010-05-22 10:57:24

+1

这完全取决于你的编译器是否允许声明后的声明。我认为这是在ISO C99中引入的,但不要引用我:-)如果你的编译器预先确定了那么你会遇到问题,因此我建议使用最新的xlc或gcc。 – paxdiablo 2010-05-22 11:07:01

1

当无辜的代码产生奇怪的错误时,尝试通过C预处理器阶段运行代码,然后查看它。有时宏会做很有趣的事情。

另请注意,早期行(缺少分号等)上的问题可能会在后面的行上产生错误消息。

+0

是不是用分号写的预处理器? 如何在预处理器阶段运行代码?任何Makefile需要更改才能这样做? PS:我正在使用cc来编译 – 2010-05-22 10:48:45

+1

@ A.Rashad,Artelius并不是指前面的那一行(无论如何你已经向我们显示过)。我们需要_more_上下文才能弄清楚。 – paxdiablo 2010-05-22 10:50:19

0

@ A.Rashad,我将第117行的HAVE_BIND #ifdef块移到第30行,该行刚好在#include“generic.h”声明之下。这允许xlc编译它。 (S)yntax错误消息不见了,虽然有一些(W)arning消息,但我最终得到了一个nc二进制文件!

心连心,

凯文

1

的后也许已经有点过时,但以防万一别人来着同样的问题一起...

这里(AIX 7.1)h_errno定义作为netdb.h中的宏。

/usr/include/netdb.h:#define h_errno (*(int *)h_errno_which()) 

因此,netcat.c行117中的声明不起作用。

我刚换行成

#ifndef h_errno 
extern int h_errno; 
#endif 

和编译工作顺利。