Как добавить предварительно скомпилированную библиотеку в ESP8266 SDK? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть предварительно скомпилированная библиотека (расширение .a), которую я хочу использовать, интегрированная в примеры RTOS SDK ESP8266.

Существует папка по следующему пути (ESP8266_RTOS_SDK \ components \ esp8266 \ lib), где есть 22 файла .a внутри. Я положил туда свою библиотеку, но компилятор как бы не распознает функции моей библиотеки.

Я прочитал кое-что о редактировании некоторых make-файлов. Должен ли я действительно сделать это? Если да, я хотел бы знать, какой файл редактировать? (по какому пути он находится)

РЕДАКТИРОВАТЬ

Это моя рабочая папка:

enter image description here

Espressif (разработчик ESP8266) ориентировал меня на то, как показано ниже на component.mk , но это не работает, компиляция продолжает показывать «неопределенную ссылку» для функция библиотеки.

enter image description here

Затем я создал переменную окружения COMPONENT_PATH для Windows, путь которого такой же, как показано в первом изображение.

enter image description here

Что-то не так с этим?

РЕДАКТИРОВАТЬ 2

Созданная папка "include" внутри main:

enter image description here

Добавлена ​​поверх C код: # include "include / lib123.h" , которая содержит только одну строку: int sum (int a, int b);

Добавлено на основной вызов: int result = sum (1,2);

Получена ошибка компилятора: неопределенная ссылка на 'sum'

* 105 9 * РЕДАКТИРОВАТЬ 3

Для каждой попытки компиляции следующий файл обновляется в папке \ esp \ tcp_server \ build.

Я не буду размещать здесь напрямую, потому что файл имеет больше чем 10.000 строк: https://raw.githubusercontent.com/jefersonpehls/esp8266_freeRTOS_firebase/master/tcp_server.map

EDIT4

Когда я пытаюсь сделать, это то, что показано:

make
Toolchain path: /opt/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc
Toolchain version: crosstool-ng-1.22.0-100-ge567ec7b
Compiler version: 5.2.0
Python requirements from C:/msys32/home/sandr/esp/ESP8266_RTOS_SDK/requirements.txt are satisfied.
LD build/tcp_server.elf
C:/msys32/home/sandr/esp/tcp_server/build/main\libmain.a(tcp_server_v5.o):(.literal.app_main+0x24): undefined reference to `sum'
C:/msys32/home/sandr/esp/tcp_server/build/main\libmain.a(tcp_server_v5.o): In function `app_main':
C:/msys32/home/sandr/esp/tcp_server/main/tcp_server_v5.c:382: undefined reference to `sum'
collect2.exe: error: ld returned 1 exit status
make: *** [C:\msys32\home\sandr\esp\ESP8266_RTOS_SDK/make/project.mk:510: /home/sandr/esp/tcp_server/build/tcp_server.elf] Error 1

РЕДАКТИРОВАТЬ 5

Вот полные шаги, которые я использую, чтобы сделать

sandr@DESKTOP-MA6RTB6 MINGW32 ~
$ cd ~/esp/tcp_server

sandr@DESKTOP-MA6RTB6 MINGW32 ~/esp/tcp_server
$ export PATH="$PATH:/opt/xtensa-lx106-elf/bin"

sandr@DESKTOP-MA6RTB6 MINGW32 ~/esp/tcp_server
$ make
Toolchain path: /opt/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc
Toolchain version: crosstool-ng-1.22.0-100-ge567ec7b
Compiler version: 5.2.0
Python requirements from C:/msys32/home/sandr/esp/ESP8266_RTOS_SDK/requirements.txt are satisfied.
LD build/tcp_server.elf
C:/msys32/home/sandr/esp/tcp_server/build/main\libmain.a(tcp_server_v5.o):(.literal.app_main+0x24): undefined reference to `sum'
C:/msys32/home/sandr/esp/tcp_server/build/main\libmain.a(tcp_server_v5.o): In function `app_main':
C:/msys32/home/sandr/esp/tcp_server/main/tcp_server_v5.c:382: undefined reference to `sum'
collect2.exe: error: ld returned 1 exit status
make: *** [C:\msys32\home\sandr\esp\ESP8266_RTOS_SDK/make/project.mk:510: /home/sandr/esp/tcp_server/build/tcp_server.elf] Error 1

РЕДАКТИРОВАТЬ 6

Это это содержимое esp \ tcp_server \ Makefile

#
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory.
#

PROJECT_NAME := tcp_server

EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common


include $(IDF_PATH)/make/project.mk

Это содержимое esp \ tcp_server \ main \ component.mk

#
# "main" pseudo-component makefile.
#
# (Uses default behaviour of compiling all source files 
# in directory, adding 'include' to include path.)

COMPONENT_ADD_INCLUDEDIRS := include
COMPONENT_ADD_LDFLAGS += $(COMPONENT_PATH)/lib123.a

, а IDF_PATH равно C: \ msys32 \ home \ sandr \ esp \ ESP8266_RTOS_SDK

РЕДАКТИРОВАТЬ 7

Это $ (IDF_PATH) /make/project.mk

https://github.com/jefersonpehls/esp8266_freeRTOS_firebase/blob/master/project.mk

1 Ответ

3 голосов
/ 28 марта 2020

Это компоновщик , а не компилятор для связывания кода библиотеки объектов.

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

При использовании цепочки инструментов GNU компоновщик (ld) регистрирует пути к библиотекам с помощью переключателя -L<searchdir>, а для библиотеки с именем libXXX.a переключатель для связывания - -lXXX.

, например:

ld -o program.elf main.o module.o -L.\MyLibraries -llinkthis.a

свяжет liblinkthis.a в Подпапка MyLibraries каталога сборки.

Если для компиляции и компоновки используется драйвер gcc или g++, эти ключи можно передать драйверу и использовать для вызова ld. Например:

gcc main.c -o main.o -c
gcc module.c -o module.o -c
gcc -L.\MyLibraries -llinkthis.a main.o module.o -o program.elf 

или для сборки с одним исходным кодом:

gcc main.c -L.\MyLibraries -llinkthis.a -o program.elf

Для других цепочек инструментов см. Документацию по цепочке инструментов / компоновщику по связыванию библиотек stati c.

Для сложных сборок со многими модулями, безусловно, вам следует использовать make-файл или аналогичный инструмент управления сборкой или (проще) IDE с менеджером проекта / сборки. IDE, скорее всего, позволит вам добавлять библиотеки и пути через диалоговые окна, а не знать все отдельные ключи для вашей цепочки инструментов, make и аналогичные инструменты могут быть более гибкими для сложных сборок, но они несколько загадочны. Однако использование make не имеет прямого отношения к вопросу о том, как связать библиотеку stati c.

...