我是靠谱客的博主 超级纸飞机,最近开发中收集的这篇文章主要介绍MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o).情况一 缺失main与SystemInit定义程序情况二 缺失SystemInit定义,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

情况一 缺失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存储地址所对应的子程序,执行该子程序。
在这里插入图片描述
  这样的话只需要将这三行注释掉(注释符号为;),重新编译,编译通过。
在这里插入图片描述在这里插入图片描述

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

最后

以上就是超级纸飞机为你收集整理的MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o).情况一 缺失main与SystemInit定义程序情况二 缺失SystemInit定义的全部内容,希望文章能够帮你解决MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o).情况一 缺失main与SystemInit定义程序情况二 缺失SystemInit定义所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部