2014-07-03 29 views
0

我無法鏈接到外部庫,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

什麼是鏈接這個庫的正確方法?是否需要在上一步中鏈接以正確的格式在此處列出?這是如何完成的?

+1

通常的做法是'-L/usr/local/lib'將'/ usr/local/lib'添加到庫搜索路徑,然後'-lMY_LIB'實際鏈接到庫(必須是名爲'libMY_LIB.a')。 – Mankarse

+1

'-L'增加一個路徑,'-l'鏈接一個庫,你可以給'-l'一個完整的路徑,以避免需要使用'-L',但是給出一個完全路徑到'-L'這沒有意義。 –

+0

@EtanReisner啊 - 謝謝你們,我開始想知道有什麼不同,應該遵循這個想法。不過'-L/usr/local/lib /'和'-lMY_LIB.a'我得到了「找不到-lMY_LIB.a」。 – OJFord

回答

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 
+0

然後我得到「無法找到-lMY_LIB.a」 – OJFord

+0

@OllieFord第一個建議是否有效?根本沒有破折號? –

+0

@EtanReisner不,我得到「無法讀取符號:格式錯誤的文件」 – OJFord

1

與adpeace刪除它從你的討論中,我收集庫而構建靶向I386使用的是顯示清楚你的目標的ARM平臺的命令。

在這種情況下,您不會有任何運氣使用這個特定的庫文件,並且需要找到它的一個arm版本。

相關問題