查找“未定义引用”错误的根本原因

Ami*_*nen 4 c linker gcc elf linker-errors

我试图了解为什么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)'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

那么,我错过了什么吗?尽管函数存在于 libmain.a 中,但 gcc 找不到该函数的原因可能是什么?
如何进一步调试此错误?

nos*_*nos 6

C++ 和 C 代码的混合会导致您的问题。

这个错误:

undefined reference to `pvPortMalloc(unsigned int, char const*, int)'
Run Code Online (Sandbox Code Playgroud)

并不是说pvPortMalloc找不到符号。它说pvPortMalloc(unsigned int, char const*, int)找不到符号,这是一个 C++ 符号。

这意味着您在编译 C++ 代码的某个地方认为有一个 C++pvPortMalloc函数,其符号也包含其签名,但您只有一个pvPortMallocC 函数。

您的 C++ 代码可能包含一个不是 C++ 干净的头文件,您需要执行以下操作:

extern "C" {
#include "some_header.h"
}
Run Code Online (Sandbox Code Playgroud)

其中 some_header.h 是声明 pvPortMalloc 函数的头文件。