【发布时间】:2017-03-18 19:29:39
【问题描述】:
我试图了解为什么我在链接过程中收到 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 转储符号时,我可以找到标记为T 的pvPortMalloc,这意味着该符号在文本(代码)部分中:
/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 找不到该函数的原因可能是什么?
如何进一步调试此错误?
【问题讨论】:
-
需要在链接行上的 .o 文件之后获取库,我相信。顺序在链接中很重要。
-
@FredLarson
--start-group/--end-group不会解决这个问题吗?它应该迭代地解析符号,直到所有符号都被解析。 -
我认为这仅适用于 .a 文件,不适用于 .o 文件。
-
@FredLarson 但命令行上没有 .o 文件。应用程序代码已经在
build/app_app.a上,这是--end-group之前的最后一个库。 -
哦。嗯,那我不知道。对不起。
标签: c gcc linker linker-errors elf