XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o).



MKD 報錯:

  linking...
LCD.axf: Error: L6218E: Undefined symbol EnZK (referred from ht128x64.o).
LCD.axf: Error: L6218E: Undefined symbol GetFlashCnBuf (referred from ht128x64.o).

 

解析:Undefined symbol EnZK,翻譯過來就是:EnZK 這個符號沒有定義,隨後的小括號告訴你了,是在 ht128x64.o 這個文件裏面被提及的,這個.o文件在工程裏面並沒有,它是一個在編譯的時候根據.c/.s文件生成的。所以我們只需要找到工程裏面的.s或者.c即可,這裏對應這個名字的就是 ht128x64.c 了。

因爲ht128x64.c文件中調用了EnZK沒有定義,解決辦法:(1)在外部.c文件中定義EnZK;

                                                                                                        (2) 把ht128x64.c文件中關於EnZK的部分註釋掉;

 

同理:引用自http://blog.sina.com.cn/s/blog_4d1854230101a0q0.html

led_blink.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f0xx.o).

     此問題錯誤提示已經十分清楚的告訴你錯在哪裏了,Undefined symbol SystemInit ,翻譯過來就是:SystemInit 這個符號沒有定義,隨後的小括號告訴你了,是在 startup_stm32f0xx.o 這個文件裏面被提及的,這個.o文件在工程裏面並沒有,它是一個在編譯的時候根據.c/.s文件生成的。所以我們只需要找到工程裏面的.s或者.c即可,這裏對應這個名字的就是 startup_stm32f0xx.s了。

   在此文件裏面可以找到SystemInit的所在:
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
   原來在復位中斷服務函數裏面,調用了SystemInit這個函數,而這個函數在.s文件裏面沒有定義。
   所以解決的辦法有兩個。
   1,在外部(其他任何.c文件裏面)定義SystemInit這個函數,哪怕是個空函數也可以。
   2,把   
           IMPORT  SystemInit              
                 LDR     R0, =SystemInit
                 BLX     R0
      這三句話註釋掉。

SystemInit 是在使用main前做一些初始化工作,如果不需要官方的庫,只是自己編寫一些簡單的應用,則可以把此函數禁掉。譬如創建工程時直接加入s文件,剩下的自己簡單編程,此時就不要SystemInit。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章