MDK4新手建立stm32工程易犯错误

N多人问我这个简单的问题。说实话,我是很烦了。一个都不肯来论坛提问。没办法我来个自问自答吧,摆脱烦躁的重复工作。
    由于标题不能输入过长的英文字符(但是中文字符可以),错误提示的全部信息如下:
STM32_TEST.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).

     此问题错误提示已经十分清楚的告诉你错在哪里了,Undefined symbol SystemInit ,翻译过来就是:SystemInit 这个符号没有定义,随后的小括号告诉你了,是在 startup_stm32f10x_md.o这个文件里面被提及的,这个.o文件在工程里面并没有,它是一个在编译的时候根据.c/.s文件生成的。所以我们只需要找到工程里面的.s或者.c即可,这里对应这个名字的就是startup_stm32f10x_md.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

      这三句话去掉。
   
    至此,此问题解决。

    回头看看,此问题够简单吧? 提示已经说得明明白白了,为什么这么多人不会解决呢? 我想不是因为不认识这几个单词(不认识可以百度,google啊),是懒惰和浮躁让他们失去了发现错误的能力和耐心。这也是任何想要成功的人,所要克服的最基本的两点。
    所以,还有此类问题的朋友,请看完此文后自己反省反省。
    另外,请有问题的朋友尽量论坛提问。求你们了....
    一个问题回答N次,真的很痛苦。

原文出处:http://www.openedv.com/posts/list/3010.htm

你可能感兴趣的:(MDK4新手建立stm32工程易犯错误)