尽管链接顺序正确,但未定义引用

时间:2014-07-03 15:59:49

标签: c++ gcc linker makefile

我无法链接到外部库MY_LIB.a

从mbed.org编译器创建的makefile中调用以下内容,并添加指向MY_LIB.a路径的链接。

arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wl,--gc-sections --specs=nano.specs 
-u _printf_float -u _scanf_float -T./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/LPC1768.ld 
-L./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM -o MyProg.elf main.o mbed/TARGET_LPC1768
/TOOLCHAIN_GCC_ARM/cmsis_nvic.o mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/system_LPC17xx.o
mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/startup_LPC17xx.o mbed/TARGET_LPC1768
/TOOLCHAIN_GCC_ARM/board.o mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/retarget.o  
-lstdc++ -lsupc++ -lm -lc -lgcc -lnosys  -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys 
-L/usr/local/lib/MY_LIB.a
main.o: In function `main':

然后,undefined reference to <function>中定义的每个函数都会出现MY_LIB个错误。

我的理解是MY_LIB.a只需在使用它的main.o之后进行关联。

我也尝试在-o MyProg.elf main.o之后立即链接,但后来我得到could not read symbols: File in wrong format

链接此库的正确方法是什么?是否需要在上一步中链接到这里列出正确的格式?怎么做的?

2 个答案:

答案 0 :(得分:1)

从您与adpeace的讨论中我收集的图书馆的目标是i386,而您正在使用的构建命令显示您正在瞄准手臂平台。

在这种情况下,您将无法使用此特定的库文件,并且需要找到它的arm版本。

答案 1 :(得分:0)

-L仅指定库的搜索路径。您可以从包含MY_LIB.a的参数中删除它,例如:

arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wl,--gc-sections --specs=nano.specs 
-u _printf_float -u _scanf_float -T./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/LPC1768.ld 
-L./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM -o MyProg.elf main.o mbed/TARGET_LPC1768
/TOOLCHAIN_GCC_ARM/cmsis_nvic.o mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/system_LPC17xx.o
mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/startup_LPC17xx.o mbed/TARGET_LPC1768
/TOOLCHAIN_GCC_ARM/board.o mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/retarget.o  
-lstdc++ -lsupc++ -lm -lc -lgcc -lnosys  -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys 
/usr/local/lib/MY_LIB.a