Мое простое тестовое приложение 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))
Константы и тому подобное, используемые в коде, разрешаются во время компиляции и поступают из заголовочных файлов. Итак pcap.h
заголовочный файл найден (видимо по умолчанию).
Я бы ожидал DEPENDS:=+libpcap
обрабатывать ссылки для вас (я не уверен, почему еще это было бы необходимо, но). (Это правильный формат для этой строки?)
Вы на самом деле хотите LDLIBS
не LDFLAGS
для этого (при условии, что вы используете встроенные правила и переменные). Увидеть 10.3 Неявные переменные за то, что они каждый имеет в виду.
Не зная, что делает остальная часть этого фреймворка, хотя я не могу сказать, LDLIBS
или же LDFLAGS
будет на самом деле работать, хотя Эта структура может иметь свою собственную переменную для этого.
Я выяснил, как скомпилировать собственный код 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-файла размещены в моем блоге — они были слишком большими, чтобы размещать их здесь.