Что не так с linux / if.h и net / if.ч?


В мой проект я включаю pfring.h, но ошибка компиляции: некоторые функции в net / if.h и linux / if.h-переопределение. Я нашел, что пфринг.h включить linux/if.х Итак, я тестирую программу, мой тестовый код:

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

int main(void) {
    return 0;
}

Ожидается ошибка компиляции. Итак, что не так с linux / if.h и net / if.ч ? Разве я не могу включить их сразу?


Сообщение об ошибке:

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   12  

4 ответа:

Для меня (на Ubuntu 12.04 x64) следующее включает решенную проблему:

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

Эта проблема была решена, добавьте флаг компиляции-DHAVE_PCAP является исправлением. ;- )

Сначала поговорим об источнике: Заголовочные файлы из разных пакетов, как вы можете видеть, спрашивая 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 (стандартная библиотека C в версии 6).

Это швы, как они взаимозаменяемы, так что вы должны использовать только один (не на 100% уверен в этом). Если вы выберете linux/if.h, Вы можете зависеть от версий ядра с вашим скомпилированным двоичным файлом.

Все новые версии библиотеки, которые я имею в виду, прилипают с net/if.h вместо linux - так что вы должны сделать то же самое.

Если вы используете один из флагов состояния интерфейса (например: IFF_UP и т. д.), вам нужно на один заголовок больше, чем указано в других сообщениях.

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