linux / if.h和net / if.h有什么问题?

时间:2012-01-06 08:08:31

标签: linux

在我的项目中,我包含了pfring.h,但是编译错误:net / if.h和linux / if.h中的一些函数是重新定义的。我发现pfring.h包含linux / if.h 所以,我测试了一个程序,我的测试代码:

#include <linux/if.h>
#include <net/if.h>

int main(void) {
    return 0;
}

预计编译错误。 那么,linux / if.h和net / if.h有什么问题? 我不能马上加入它们吗?


错误消息:

In file included from test.c:1:0:
/usr/include/linux/if.h:178:19: error: field 'ifru_addr' has incomplete type
/usr/include/linux/if.h:179:19: error: field 'ifru_dstaddr' has incomplete type
/usr/include/linux/if.h:180:19: error: field 'ifru_broadaddr' has incomplete type
/usr/include/linux/if.h:181:19: error: field 'ifru_netmask' has incomplete type
/usr/include/linux/if.h:182:20: error: field 'ifru_hwaddr' has incomplete type
In file included from test.c:2:0:
/usr/include/net/if.h:45:5: error: expected identifier before numeric constant
/usr/include/net/if.h:112:8: error: redefinition of 'struct ifmap'
/usr/include/linux/if.h:136:8: note: originally defined here
/usr/include/net/if.h:127:8: error: redefinition of 'struct ifreq'
/usr/include/linux/if.h:170:8: note: originally defined here
/usr/include/net/if.h:177:8: error: redefinition of 'struct ifconf'
/usr/include/linux/if.h:219:8: note: originally defined here

4 个答案:

答案 0 :(得分:16)

对我来说(在Ubuntu 12.04 x64上),以下内容解决了这个问题:

#include <sys/socket.h> // <-- This one
#include <linux/if.h>
#include <linux/if_tun.h>

答案 1 :(得分:3)

此问题已解决,添加编译标志-DHAVE_PCAP即可修复。 ; - )

答案 2 :(得分:1)

首先让我们谈谈来源: 头文件来自不同的包,你可以看到询问dpkg。

$ dpkg -S /usr/include/linux/if.h linux-libc-dev:i386: /usr/include/linux/if.h $ dpkg -S /usr/include/net/if.h libc6-dev:i386: /usr/include/net/if.h

linux-libc-dev是linux内核包的一部分,而libc6-dev是libc6(版本6中的标准C库)的一部分。

它接缝就像它们可以互换,所以你应该只使用一个(不是100%肯定这个)。 如果选择linux/if.h,则可能依赖于已编译二进制文件的内核版本。

我想到的所有新库版本都坚持使用net/if.h而不是linux版本 - 所以你应该这样做。

答案 3 :(得分:0)

如果您正在使用其中一个接口状态标志(例如:IFF_UP等),则需要比其他帖子中提到的标题多一个。

#include <sys/types.h>   // <== 
#include <sys/socket.h>
#include <linux/if.h>