pcap неопределенная ссылка на ошибку

Я пытаюсь прочитать данные из файлов pcap, используя pcap_open_offline(). Я использовал #include <pcap/pcap.h> и скомпилировал без ошибок после некоторой отладки. Теперь я столкнулся с другой проблемой, которую не могу понять. Я написал следующую функцию:

void openPcap(char* filename){
  printf("Opening file %s\n", filename);
  pcap_t *pcap;
  const unsigned char *packet;
  char errbuf[PCAP_ERRBUF_SIZE];
  struct pcap_pkthdr header;
  pcap = pcap_open_offline(filename, errbuf);
  if (pcap == NULL){
    fprintf(stderr, "%s Malformed packet records in file %s",ER,filename);
  }
}

И мой вызов pcap_open_offline выдает около 100 таких ошибок, когда я пытаюсь скомпилировать:

pcap-linux.c:(.text+0xcd4): undefined reference to 'nl_handle_alloc'
pcap-linux.c:(.text+0xce8): undefined reference to 'genl_connect'
pcap-linux.c:(.text+0xcf6): undefined reference to 'genl_ctrl_alloc_cache'
pcap-linux.c:(.text+0xd0e): undefined reference to 'genl_ctrl_search_by_name'
pcap-linux.c:(.text+0xd64): undefined reference to 'nl_handle_destroy'
pcap-linux.c:(.text+0xdd7): undefined reference to 'nl_cache_free'

Вот как выглядит мой make-файл:

# -------------------------------
C=/afs/nd.edu/user14/csesoft/new/bin/gcc
CFLAGS=-Wall -std=c11 -I/afs/nd.edu/coursesp.18/cse/cse30341.01/support/gcc-libpcap/include -D_BSD_SOURCE
LD=/afs/nd.edu/user14/csesoft/new/bin/g++
#LD=g++
LDFLAGS=-lpthread
# # ----------------------------

LDFLAGS += -L/afs/nd.edu/coursesp.18/cse/cse30341.01/support/gcc-libpcap/lib -lpcap                 # Add your own flags here, or leave blank

threadedRE: threadedRE.o
    $(LD) $^ $(LDFLAGS) -o $@

threadedRE.o: threadedRE.c
    $(C) $(CFLAGS) -c $<

# C compiler
 %.o: %.c
    $(C) $(CFLAGS) -c $<

.PHONY: clean
clean:
    rm -f threadedRE *.o

И мои заголовки:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include <string.h>
#include <sys/stat.h>
#include <pcap/pcap.h>

Любые предложения будут ценны.


person zkous    schedule 28.03.2018    source источник


Ответы (1)


Это не ошибка компиляции, а ошибка компоновки. В конце процесса сборки вы должны увидеть что-то вроде «ld exited with error».

pcap_open_offline() похоже использует nl_handle_alloc() и другие функции, но компоновщик не может найти объектные файлы, содержащие их реализацию. Указание компоновщика на правильную библиотеку, содержащую требуемые объектные файлы, путем добавления -lnl к LDFLAGS должно помочь.

person nnovich-OK    schedule 29.03.2018
comment
Мой ТА тоже это предлагал, но это не сработало. В итоге я продвинулся вперед, просто вручную проанализировав файлы pcap. Спасибо за помощь! Надеюсь, -lnl работает для кого-то еще, кто сталкивается с этой проблемой. - person zkous; 30.03.2018