Makefile для программы на C с использованием libpcap (проблемы с зависимостями) - PullRequest
0 голосов
/ 21 октября 2019

Я создаю Makefile для программы, основанной на libpcap. Этот Makefile будет использоваться для компиляции программы в OpenWrt SDK, а затем для переноса исполняемого файла на мой маршрутизатор. Это Makefile:

path = /home/foo/Desktop/sdk/openwrt-sdk-18.06.4-x86-64_gcc- 7.3.0_musl.Linux-x86_64/staging_dir/target-x86_64_musl/usr/lib

pcap_retrans: pcap_retrans.o
$(CC) $(LDFLAGS) -o pcap_retrans pcap_retrans.o -L$(path) -lpcap -L -libc

pcap_retrans.o: pcap_retrans.c
$(CC) $(CFLAGS) -c pcap_retrans.c cbuffer.c

Однако, когда я "делаю", появляются следующие ошибки:

cc  -c pcap_retrans.c cbuffer.c
cc  -o pcap_retrans pcap_retrans.o -L/home/inesmll/Desktop/sdk/openwrt-sdk-18.06.4-x86-64_gcc-7.3.0_musl.Linux-x86_64/staging_dir/target-x86_64_musl/usr/lib -lpcap -L -libc
/usr/bin/ld: warning: libc.so, needed by 
/home/inesmll/Desktop/sdk/openwrt-sdk-18.06.4-x86-64_gcc-7.3.0_musl.Linux-x86_64/staging_dir/target-x86_64_musl/usr/lib/libpcap.so, not found (try using -rpath or -rpath-link)
pcap_retrans.o: In function `got_packet':
pcap_retrans.c:(.text+0x30a): undefined reference to `cbuffer_put'
pcap_retrans.c:(.text+0x334): undefined reference to `cbuffer_getretrans'
pcap_retrans.c:(.text+0x364): undefined reference to `cbuffer_getnumretrans'
pcap_retrans.o: In function `main':
pcap_retrans.c:(.text+0x818): undefined reference to `cbuffer_init'
pcap_retrans.c:(.text+0x87c): undefined reference to `cbuffer_free'
/usr/bin/ld: pcap_retrans: hidden symbol `atexit' in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(atexit.oS) is referenced by DSO
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
Makefile:4: recipe for target 'pcap_retrans' failed
make: *** [pcap_retrans] Error 1

Я считаю, что это связано с тем, как я связываю cbuffer.c в Makefile (этот файл находится в той же папке, что и pcap_retrans.c), однако я не знаю, как это исправить. Есть идеи?

1 Ответ

2 голосов
/ 21 октября 2019

$(CC) $(CFLAGS) -c pcap_retrans.c cbuffer.c выглядит подозрительно.

Вы можете скомпилировать pcap_retrans.c и cbuffer.c в отдельные объектные файлы. И pcap_retrans зависит от pcap_retrans.o и cbuffer.o. Например,

pcap_retrans: pcap_retrans.o cbuffer.o
    $(CC) $(LDFLAGS) -o $@ $^ -L$(path) -lpcap

%.o: %.c
    $(CC) -c $(CFLAGS) -o $@ $<

Просто понял, что -libc на самом деле связывает библиотеку с именем libibc.so или libibc.a, а не стандартную библиотеку C. Если эта библиотека находится в каталоге <dir>, вы можете связать ее несколькими способами:

  1. Передать полный путь к библиотеке в команде компоновщика, например, $(CC) $(LDFLAGS) -o $@ $^ -L$(path) -lpcap <dir>/libibc.so.
  2. Укажите пути компоновщика в команде компоновщика, например $(CC) $(LDFLAGS) -o $@ $^ -L$(path) -lpcap -L<dir> -Wl,-rpath=<dir> -libc. Вы можете указать несколько -Wl,-rpath=, и именно здесь ld.so (динамический компоновщик времени выполнения) будет искать libibc.so во время выполнения.
...