lib中的类型和/ usr / include中的.h文件之间的冲突

时间:2016-03-18 01:25:46

标签: c

我正在尝试编译Unix网络编程website here的源代码。在编译本书源代码的libfree目录时,我收到此错误,表明在本书库的inet_top.c文件中声明的函数与之间存在冲突类型我的OSX上h目录/文件中的/usr/include/arpa/inet.h文件。

我不知道我的Mac上的目录/文件(即/usr/include/arpa/inet.h)是否带有安装(这可能表明我是否应该删除它)或者它是否是我随后/购买后安装(可能意味着我可以安全删除)或者是否有解决冲突而不删除的方法。尽管最后一句话并没有以?结尾,但我希望能够回答这个问题。

gcc -I../lib -g -O2 -D_REENTRANT -Wall   -c -o inet_ntop.o inet_ntop.c
inet_ntop.c:56:1: error: conflicting types for 'inet_ntop'
inet_ntop(af, src, dst, size)
^
/usr/include/arpa/inet.h:77:13: note: previous declaration is here
const char      *inet_ntop(int, const void *, char *, socklen_t);
                 ^
1 error generated.
make: *** [inet_ntop.o] Error 1

3 个答案:

答案 0 :(得分:1)

您绝对不想删除/usr...中的标头,它是系统标头的一部分。最好从书中修复源代码。事实上,由于我也在Mac上,我很快下载了源代码并尝试了它。陷入错误。问题是第4个参数:它在图书来源中的类型为size_t,但标题为socklen_t。因此,请按以下方式修改inet_ntop

...
const char *
inet_ntop(af, src, dst, size)
        int af;
        const void *src;
        char *dst;
        socklen_t size;  /* socklen_t was size_t originally */
{
        switch (af) {
...

这解决了我的问题。

在CentOS 7盒子上试试,我得到了同样的错误。同样的修复也在那里工作。看起来书中的代码相当陈旧,因此某些API可能略有变化。

答案 1 :(得分:1)

UNP中的代码太旧,以至于标准库已更改,但UNP的代码仍在使用旧代码。因此,您只需修改UNP中的inet_ntop以符合标准库/usr/include/arpa/inet.h

答案 2 :(得分:0)

如果您正在为Windows™进行编译,请使用该版本,

如果您正在为iOS编译,请使用 inet_ntop()

的定义