Проблемы при связывании pcap.p при установке libpcap на моем Ubuntu - PullRequest
0 голосов
/ 14 июля 2020

Я нашел удобную программу захвата пакетов в C и пошел скомпилировать ее на своем домашнем компьютере с Ubuntu. Исходный код имел это вверху:

#include <pcap/pcap.h>

Но когда я скомпилировал, я увидел следующее:

root@ubuntu:/home/me# gcc -Wall packetCap.c
/tmp/cc2kDt1M.o: In function `main':
packetCap.c:(.text+0x33): undefined reference to `pcap_lookupdev'
packetCap.c:(.text+0xa0): undefined reference to `pcap_open_live'
packetCap.c:(.text+0xef): undefined reference to `pcap_next'
collect2: error: ld returned 1 exit status
root@ubuntu:/home/me#

Не похоже, что код может видеть pcap.h. Я выполнил поиск, нашел то, что кажется полностью работающей версией pcap.h в /usr/include/pcap/, а затем изменил свой код на этот:

//#include <pcap/pcap.h>                // if this gives you an error try pcap/pcap.h
#include "/usr/include/pcap/pcap.h"

Но у меня все еще были те же самые ошибки компиляции .

Кто-нибудь видит, что я делаю не так? Я просмотрел более ранние сообщения StackOverflow, и вот некоторые основные c уловки, которые я сделал, чтобы исключить предыдущие рекомендации SO:

Во-первых, указание каталога при компиляции не повлияло:

root@ubuntu:/home/me# gcc -I/usr/include/pcap -Wall packetCap.c
/tmp/cc2kDt1M.o: In function `main':
packetCap.c:(.text+0x33): undefined reference to `pcap_lookupdev'
packetCap.c:(.text+0xa0): undefined reference to `pcap_open_live'
packetCap.c:(.text+0xef): undefined reference to `pcap_next'
collect2: error: ld returned 1 exit status
root@ubuntu:/home/me#

Я набрал /usr/include/pcap/pcap.h, и похоже, что нужные мне функции описаны в:

root@ubuntu:/home/me# more /usr/include/pcap/pcap.h | grep pcap_lookupdev
PCAP_API char   *pcap_lookupdev(char *);
root@ubuntu:/home/me# more /usr/include/pcap/pcap.h | grep pcap_open_live
        char *name;             /* name to hand to "pcap_open_live()" */
PCAP_API pcap_t *pcap_open_live(const char *, int, int, int, char *);
root@ubuntu:/home/me# more /usr/include/pcap/pcap.h | grep pcap_next
PCAP_API const u_char *pcap_next(pcap_t *, struct pcap_pkthdr *);
PCAP_API int    pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **);
root@ubuntu:/home/me#

И у меня определенно установлен libpcap:

root@ubuntu:/home/me# apt-get install libpcap-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
libpcap-dev is already the newest version (1.7.4-2ubuntu0.1).
The following packages were automatically installed and are no longer required:
  libjline-java libnetty-3.9-java libpython-all-dev libpython3-dev libpython3.5-dev libzookeeper-java python-all python-all-dev python-pip-whl python-wheel python3-dev python3-wheel python3.5-dev zookeeper
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 442 not upgraded.
root@ubuntu:/home/me#

Нужно ли мне делать #define PCAP_API на остановке моего кода что ли? Может ли кто-нибудь заметить, что я делаю неправильно? Спасибо.

1 Ответ

2 голосов
/ 14 июля 2020

Вам не хватает библиотеки pcap в команде связывания. Лучший способ узнать, что pcap включает пути и библиотеки для связывания, - это использовать инструмент pcap-config.

$ pcap-config --cflags
-I/usr/include
$ pcap-config --libs
-lpcap

В команде компиляции вы можете использовать:

gcc -Wall -Wextra $(pcap-config --cflags) packetCap.c $(pcap-config --libs)
...