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).
在这里插入图片描述
  这里大概意思是由于在启动文件中调用了SystemInit子程序和main程序,但是没有定义这两个函数,所以无法编译通过。
  这里我们需要写个C程序,定义一下这两个函数,通过File->New建立空白文件,Ctrl+S保存为main.c的C程序。在里面写入以下程序,定义main和SystemInit即可。

int main(void)
{

}
void SystemInit(void)
{

} 

  完了一定要把自己写的这段程序main.c加入当前工程中,如下图,否者编译还会出现之前的报错信息。
在这里插入图片描述
  重新编译,编译通过。
在这里插入图片描述

情况二 缺失SystemInit定义

方法1

  还有很多人写了主函数main的定义,但是没有定义函数SystemInit,然后编译后会出现下面这种报错。
在这里插入图片描述
  其实,换汤不换药,参照前面的操作在main.c中加入SystemInit的定义即可,或者重新写个SystemInit.c定义一下SystemInit即可。
  重新编译通过。
在这里插入图片描述

方法2

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

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

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值