我正在尝试编译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
答案 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()
的定义