【发布时间】:2020-03-24 07:08:56
【问题描述】:
我有一个预编译的库(.a 扩展名),我想在 ESP8266 RTOS SDK 示例中使用它。
在以下路径(ESP8266_RTOS_SDK\components\esp8266\lib)中有一个文件夹,里面有 22 个 .a 文件。我已经把我的库放在那里了,但是编译器就像它没有识别我的库的功能。
我已经阅读了一些关于编辑一些 makefile 的内容。我真的应该这样做吗?如果是,我想知道要编辑哪个文件? (放置在哪个路径上)
编辑
这是我的工作文件夹:
我被 Espressif(ESP8266 的开发者)指导在 component.mk 上制作如下所示,但它不起作用,编译一直显示“未定义的引用”对于库的功能。
然后我在 Windows 上创建了一个名为 COMPONENT_PATH 的环境变量,其路径与第一张图片中显示的相同。
这有什么问题吗?
编辑 2
在 main: 中创建文件夹“include”:
在 C 代码之上添加:#include "include/lib123.h",其中仅包含一行:int sum (int a, int b);
在 main 上添加了一个调用:int result = sum(1,2);
得到编译器错误:未定义对“sum”的引用
编辑 3
对于每次编译尝试,文件夹 \esp\tcp_server\build 中的以下文件都会更新。
这里就不直接放了,因为文件有10000多行: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
【问题讨论】:
-
发布文字,而不是文字图片。
-
“未定义引用”是链接器错误,而不是编译器错误。发布整个构建日志,而不是描述它。这是必不可少的诊断信息——所有这些信息,而不仅仅是最终的错误消息。
-
地图文件不是我们这里需要的。 构建日志 是构建期间 向控制台输出的所有文本。即包含您正在描述的错误消息的文本。
-
LD build/tcp_server.elf是链接器命令行。奇怪的是它使用大写字母,但它不包含您在 component.mk 中设置的任何标志。不知何故,您需要使 ld 命令行在我的回答中看起来像这样。为此,您必须更好地了解您的构建是如何设置的,或者至少告诉使用您是如何构建它的 - 发出了什么命令以及项目和/或制作文件的内容(作为文本,而不是图片文本)。 -
您需要将~/esp/tcp_server/makefile 和~/esp/tcp_server/main/component.mk 的文本内容添加到您的问题中
标签: sdk embedded static-libraries esp8266 rtos