c - 查找 `undefined reference` 错误的根本原因

标签 c gcc linker linker-errors elf

我试图理解为什么我会收到 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/

相关文章:

c - 无法识别问题 GNU 存档器。使用 *.o 编译可以,但 libname.a 不行

c++ - "error: expected primary-expression before ' volatile '"

linux - fio启动时如何加载各种io引擎?

module - 模块和共享库之间的区别?

c - 哪些Windows版本不支持unicode API调用?

C 文字常量 : in header or C file?

c - 从文件中扫描一个 int 数组

c++ - gcc 和 clang 抛出 "no matching function call"但 msvc (cl) 编译并按预期工作

c - 在 C 中,是否可以将导出的函数名称更改为不同的名称?

c - 我不断收到错误消息 : "Conflicting types for ' sqrt' "