Ответ 1
Эта проблема решена, добавьте флаг компиляции -DHAVE_PCAP.; -)
В моем проекте я включаю 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
Эта проблема решена, добавьте флаг компиляции -DHAVE_PCAP.; -)
Для меня (на Ubuntu 12.04 x64) следующие проблемы включают проблему:
#include <sys/socket.h> // <-- This one
#include <linux/if.h>
#include <linux/if_tun.h>
Сначала поговорим об источнике: Файлы заголовков из разных пакетов, как вы можете видеть, спрашивают 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 kernel, тогда как libc6-dev является частью libc6
(библиотека Standard C в версии 6).
Это швы, как будто они взаимозаменяемы, поэтому вы должны использовать только один (а не 100% уверен в этом).
Если вы выберите linux/if.h
, вы можете зависеть от версий ядра с вашим скомпилированным двоичным кодом.
Все новые версии библиотеки, которые я имею в виду, имеют net/if.h
вместо linux, поэтому вы должны сделать то же самое.
Если вы используете один из флагов состояния интерфейса (например: IFF_UP и т.д.), вам нужен еще один заголовок, который упоминается в других сообщениях.
#include <sys/types.h> // <==
#include <sys/socket.h>
#include <linux/if.h>