MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o).

情况一 缺失main与SystemInit定义程序

  在MDK中编译从ARM官网下载下来的Cortex-M0的启动文件startup_CMDK_cm0.s出现以下报错
.\code.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o).
.\code.axf: Error: L6218E: Undefined symbol main (referred from __rtentry2.o).
MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第1张图片
  这里大概意思是由于在启动文件中调用了SystemInit子程序和main程序,但是没有定义这两个函数,所以无法编译通过。
  这里我们需要写个C程序,定义一下这两个函数,通过File->New建立空白文件,Ctrl+S保存为main.c的C程序。在里面写入以下程序,定义main和SystemInit即可。

int main(void)
{

}
void SystemInit(void)
{

} 

  完了一定要把自己写的这段程序main.c加入当前工程中,如下图,否者编译还会出现之前的报错信息。
MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第2张图片
  重新编译,编译通过。
MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第3张图片

情况二 缺失SystemInit定义

方法1

  还有很多人写了主函数main的定义,但是没有定义函数SystemInit,然后编译后会出现下面这种报错。
MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第4张图片
  其实,换汤不换药,参照前面的操作在main.c中加入SystemInit的定义即可,或者重新写个SystemInit.c定义一下SystemInit即可。
  重新编译通过。
MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第5张图片

方法2

  对于缺失SystemInit的定义而导致的报错,还有这种方法:既然你因为调用这个SystemInit函数而报错,那么我不调用不就行了。
  如果学过汇编的话,可以查看启动汇编代码startup_CMDK_cm0.s中复位中断部分程序Reset_Handler,在这里引用了SystemInit子程序(IMPORT SystemInit),并且执行伪指令LDR R0, =SystemInit将SysteInit的入口地址赋给寄存器R0,然后通过跳转指令BLX R0跳转至寄存器R0存储地址所对应的子程序,执行该子程序。
MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第6张图片
  这样的话只需要将这三行注释掉(注释符号为;),重新编译,编译通过。
MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第7张图片MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o)._第8张图片

注:以上仅为个人学习过程解决问题的过程,如果能解决您的问题,可以点个赞,如果无法解决您的问题,可以评论区友善交流学习哦。

你可能感兴趣的:(硬件工程,fpga开发)