我试图理解为什么我会收到 undefined reference
链接时出错:
/home/amirgon/projects/esp8266/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc -L/home/amirgon/projects/esp8266/esp-open-sdk/sdk/lib -T/home/amirgon/projects/esp8266/esp-open-sdk/sdk/ld/eagle.app.v6.cpp.ld -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static -Wl,--start-group -lc -lgcc -lhal -lphy -lpp -lnet80211 -llwip -lwpa -lmain build/app_app.a -Wl,--end-group -o build/app.out
build/app_app.a(routines.o):(.text+0x4): undefined reference to `pvPortMalloc(unsigned int, char const*, int)'
gcc 提示它找不到函数
pvPortMalloc
.然而,我可以确认此功能存在于
libmain.a
! 在上面的命令行中,libmain 被
-lmain
引用并且库路径设置为 -L/home/amirgon/projects/esp8266/esp-open-sdk/sdk/lib
.当我从
libmain.a
转储符号时在这条路上我可以找到 pvPortMalloc
标记为 T
,这意味着符号在文本(代码)部分:/home/amirgon/projects/esp8266/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-nm -g /home/amirgon/projects/esp8266/esp-open-sdk/sdk/lib/libmain.a | grep pvPortMalloc
U pvPortMalloc
0000014c T pvPortMalloc
U pvPortMalloc
那么,我错过了什么吗?
尽管函数存在于 libmain.a 中,但 gcc 找不到该函数的原因可能是什么?
如何进一步调试此错误?
最佳答案
C++ 和 C 代码的混合会导致您的问题。
这个错误:
undefined reference to `pvPortMalloc(unsigned int, char const*, int)'
不说符号
pvPortMalloc
找不到。它说符号pvPortMalloc(unsigned int, char const*, int)
找不到,这是一个 C++ 符号。
这意味着您在编译 C++ 代码的某个地方认为存在 C++
pvPortMalloc
函数,其符号也包含其签名,但您只有一个 pvPortMalloc
C 函数。可能你的 C++ 代码包含一个不是 C++ 干净的头文件,你需要做这样的事情:
extern "C" {
#include "some_header.h"
}
其中 some_header.h 是声明 pvPortMalloc 函数的头文件。
关于c - 查找 `undefined reference` 错误的根本原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431563/