如何将预编译库添加到ESP8266 SDK?

如何将预编译库添加到ESP8266 SDK?,sdk,embedded,static-libraries,esp8266,rtos,Sdk,Embedded,Static Libraries,Esp8266,Rtos,我有一个预编译库。我想在ESP8266 RTOS SDK示例中集成使用该库的扩展 路径ESP8266\U RTOS\U SDK\components\ESP8266\lib上有一个文件夹,其中包含22个.a文件。我已经把我的库放在那里了,但是编译器好像没有识别库的函数 我读了一些关于编辑一些makefile的内容。我真的应该这样做吗?如果是,我想知道哪个文件要编辑?它放置在哪个路径上 编辑 这是我的工作文件夹: ESP8266的Espressif开发人员指导我在component.mk上制作如下

我有一个预编译库。我想在ESP8266 RTOS SDK示例中集成使用该库的扩展

路径ESP8266\U RTOS\U SDK\components\ESP8266\lib上有一个文件夹,其中包含22个.a文件。我已经把我的库放在那里了,但是编译器好像没有识别库的函数

我读了一些关于编辑一些makefile的内容。我真的应该这样做吗?如果是,我想知道哪个文件要编辑?它放置在哪个路径上

编辑

这是我的工作文件夹:

ESP8266的Espressif开发人员指导我在component.mk上制作如下所示的代码,但它不起作用,编译过程一直显示库函数的未定义引用

然后,我在Windows上创建了一个名为COMPONENT_PATH的环境变量,它的路径与第一张图中所示的路径相同

这有什么问题吗

编辑2

创建的文件夹包含在主文件夹中:

在C代码之上添加:include/lib123.h,它只包含一行:int sum int a,int b

在主a调用中添加:int result=sum1,2

获取编译器错误:未定义对“sum”的引用

编辑3

对于每次编译尝试,将在文件夹\esp\tcp\u server\build中更新以下文件

我不会直接放在这里,因为该文件有超过10.000行:

编辑4

当我尝试制作时,如下所示:

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\U服务器\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\U 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_路径为C:\msys32\home\sandr\esp\ESP8266\u RTOS\u SDK

编辑7

这是$IDF_PATH/make/project.mk

链接对象库代码是链接器的工作,而不是编译器的工作

仅仅将库放在文件夹中是不够的,链接器需要知道库的路径和库名称。该文件不必与其他库位于同一文件夹中,尽管这样可以避免向链接器命令行添加额外的库路径

如果使用GNU工具链,链接器ld将使用-L开关注册库路径,对于名为libXXX.a的库,链接它的开关为-lXXX

e、 g:

ld -o program.elf main.o module.o -L.\MyLibraries -llinkthis.a
将链接生成目录的MyLibraries子文件夹中的liblinkthis.a

如果使用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
有关其他工具链,请参阅关于链接静态库的工具链/链接器文档


对于包含许多模块的复杂构建,那么您当然应该使用makefile或类似的构建管理工具,或者更容易使用带有项目/构建管理器的IDE。IDE可能允许您通过对话框添加库和路径,而无需了解工具链、make和类似工具的所有单独开关,对于复杂的构建,它们可能更灵活,但有些神秘。但是,使用make实际上与如何链接静态库的问题没有直接关系。

是将.o转换为.a的链接器吗?是否在该转换中我需要尝试隐藏符号?@abomin3v3l在您的编辑中,您试图链接include/lib123.a,但lib123.a不在include子目录中。事实上没有包括在内。我的回答只是对如何链接的一般描述。make文件需要按照我的建议生成命令行。您只需要-l123,因为您的库位于生成目录中。@abomin3v3l链接器不转换任何内容,而是链接。它将多个对象文件组合在一起,确定它们在图像中的位置,并解析对象代码与实际地址之间的符号链接。lib123.a的正确路径应该是什么?我的环境变量路径正确吗?为什么包括/lib123.a?你从哪里得到的?谢谢你的帮助@abomin3v3l构建日志将通过显示make生成的命令来说明一切,但您尚未提供。但它不起作用,不是一个有用的诊断;生成输出的消息是.Post文本,而不是文本图片。未定义引用是链接器错误,而不是编译器错误。发布整个构建日志,而不是描述它。这是重要的诊断信息——所有这些信息,而不仅仅是最后的错误信息。映射文件不是我们需要的。生成日志是生成期间输出到控制台的所有文本。i、 e.包含您正在描述的错误消息的文本.LD build/tcp_server.elf是链接器命令行。奇怪的是,它使用大写,但它不包括您在component.mk中设置的任何标志。不知何故,您需要使ld命令行在我的回答中看起来像这样。为此,您必须更好地了解构建是如何设置的,或者至少告诉用户如何使用
如何构建-发出了哪些命令以及项目和/或将文件内容设置为文本,而不是文本图片。您需要在问题中添加~/esp/tcp_server/makefile和~/esp/tcp_server/main/component.mk的文本内容