Связывание библиотеки pcap в OpenWrt Makefile

Мое простое тестовое приложение pcap компилируется и работает нормально, используя: gcc main.c -o test -lpcap

но при использовании OpenWrt SDK: make package/myapp/compile V=s

Я получаю сообщение об ошибке:

main.c:(.text.startup+0x24): undefined reference to `pcap_lookupdev'
collect2: error: ld returned 1 exit status

Из того, что я прочитал, мне нужно добавить строку:

LDFLAGS = -lpcap

к одному из Makefiles, но я не уверен, куда он должен идти. Что меня смущает, так это то, что я могу использовать константу pcap PCAP_ERRBUF_SIZE, может кто-нибудь сказать мне, почему я могу получить доступ к этому, но не к функциям pcap?

main.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pcap.h>

int main(int argc, char **argv)
{
printf("Hello PCAP!\n");
char *dev, errbuf[PCAP_ERRBUF_SIZE];
printf("%d\n\n", PCAP_ERRBUF_SIZE);

// Make works without this part
dev = pcap_lookupdev(errbuf);
printf("Device: %s\n", dev);
return 0;
}

Makefile

include $(TOPDIR)/rules.mk

PKG_NAME:=myapp
PKG_VERSION:=0.1
PKG_RELEASE:=1

include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mkdefine Package/myapp
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:=+libpcap
TITLE:=Intro to PCAP for OpenWrt
endef

define Package/myapp/description
Outputs device name
endef

define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
LDFLAGS=-lpcap
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/myapp/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/myapp $(1)/usr/bin/

$(INSTALL_DIR) $(1)/etc/init.d/
$(INSTALL_BIN) files/myapp.init $(1)/etc/init.d/myapp
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) files/myapp.config $(1)/etc/config/myapp
endef

$(eval $(call BuildPackage,myapp))

1

Решение

Константы и тому подобное, используемые в коде, разрешаются во время компиляции и поступают из заголовочных файлов. Итак pcap.h заголовочный файл найден (видимо по умолчанию).

Я бы ожидал DEPENDS:=+libpcap обрабатывать ссылки для вас (я не уверен, почему еще это было бы необходимо, но). (Это правильный формат для этой строки?)

Вы на самом деле хотите LDLIBS не LDFLAGS для этого (при условии, что вы используете встроенные правила и переменные). Увидеть 10.3 Неявные переменные за то, что они каждый имеет в виду.

Не зная, что делает остальная часть этого фреймворка, хотя я не могу сказать, LDLIBS или же LDFLAGS будет на самом деле работать, хотя Эта структура может иметь свою собственную переменную для этого.

1

Другие решения

Я выяснил, как скомпилировать собственный код C для OpenWrt (запуска на процессоре mips внутри маршрутизатора TP-LINK), который зависит от других библиотек (также в C), и генерировать .ipk для обоих (библиотеки и исполняемого файла) через единственная команда make. Сама библиотека должна была быть извлечена из

Я задокументировал усилия в моем блоге Вот

В основном задействованы три файла Makefile — один для библиотеки, которая сообщает системе сборки, откуда взять tarball. Два других будут для вашего родного кода C. Рассмотрим мой случай, например: я хочу скомпилировать мой код (mfm383c), который использует библиотеку (libmodbus):

/package/libmodbus/Makefile — здесь указывается URL-адрес, из которого можно получить архив с исходными текстами, и система извлечет источники и скомпилирует их для вас. Он также сообщает системе, где разместить файл .so, когда файл .ipk установлен на цели OpenWrt.

/package/mfm383c/src/Makefile — этот Makefile заботится о том, чтобы сообщить системе сборки, как компилировать .c и .h, а также передает флаг зависимости компоновщику (-lmodbus)

/package/mfm383c/Makefile — Этот Makefile является наиболее важным из трех — он сообщает системе сборки, что нужно собрать библиотеку libmodbus перед сборкой mfm383c, чтобы обеспечить соответствие зависимостей. Мы также должны убедиться, что файл modbus.h, включенный в mfm383c.c, находится в нужном месте. Самым заметным разделом этого файла является следующая строка в конце:

$(eval $(call BuildPackage,mfm383c,+libmodbus))

и часть о том, что код зависит от другого пакета в разделе define:

DEPENDS:=+libmodbus

Все три make-файла размещены в моем блоге — они были слишком большими, чтобы размещать их здесь.

0

По вопросам рекламы [email protected]