MDK编译出现*.axf: Error: L6218E: Undefined symbol 问题解决方法

https://blog.csdn.net/niliushanls/article/details/50498875
引文参考此贴写成,原帖链接 http://blog.csdn.net/yx_l128125/article/details/9231385

在使用MDK编译工程时出现了如下错误,test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o).`
test是工程名称,Undefined symbol SystemInit 意为符号SystemInit未定义,startup_stm32f10x_hd.o这个文件是根据startup_stm32f10x_hd.s这个文件生成的。这个文件是STM32的启动文件,在这个文件中搜索一下SystemInit,得到如下结果(在150行左右)有这样一段程序。

            Reset_Handler   PROC
            EXPORT  Reset_Handler             [WEAK]
            IMPORT  __main
            IMPORT  SystemInit
            LDR     R0, =SystemInit
            BLX     R0               
            LDR     R0, =__main
            BX      R0
            ENDP</span>

这段代码中调用了SystemInit,但是这个SystemInit并没有定义,所以会导致编译出错。

解决方法有两种:

第一种:在工程当中任意一个C文件中加入SystemInit函数的定义,定义为空函数就可以正常编译。我在main.c中加入了这样的函数定义。
void SystemInit()
{
//do nothing

第二种:把调用SytemInit的代码注释掉。注意这是汇编程序,注释用 “;”,把一开始的那段代码改成下面这样,引号为添加的内容。
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
; IMPORT SystemInit
; LDR R0, =SystemInit
; BLX R0
LDR R0, =__main
BX R0
ENDP


以上两种方法均测试通过。前提是比较简单的小工程不需要用到SystemInit,如果要用到SystemInit的话还是要在合适的位置加上SystemInit的函数定义。
  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这个错误表示编译器在链接时无法找到`flag1`的定义。你需要确保在链接时已经包含了`flag1`的定义。请检查你的代码中是否定义了`flag1`变量,并且在使用它之前已经初始化。如果你的代码中没有定义`flag1`,你需要在代码中添加定义。如果你已经定义了`flag1`,请检查它的作用域是否正确,并且是否正确链接了相关的对象文件。 ### 回答2: .\Objects\main.axf: Error: L6218E: 未定义的符号flag1(被timer.o引用)。 这个错误意味着在timer.o文件中引用了一个未定义的符号flag1。在C语言中,符号是变量名、函数名等标识符的统称。当一个模块引用一个符号时,编译器会在链接阶段查找并连接相应的定义。然而,如果找不到对应的定义,就会出现上述错误。 要解决这个问题,我们需要确保在timer.o文件中引用的flag1符号有一个正确的定义。首先,可以检查代码中是否有定义flag1的地方。如果没有定义,我们需要添加一个flag1的定义。可以通过在timer.o中或其他文件中添加以下代码来定义flag1: int flag1; 或者如果已经有一个flag1的全局变量定义,那么可能是由于某些原因该定义没有被正确引入timer.o,我们可以检查Makefile或编译器的参数配置,以确保所有需要的文件都被包含在编译过程中。 另外,还需要确保在编译timer.c文件时,已经包含了flag1的声明。可以在timer.c文件中添加以下代码: extern int flag1; 这样,在引用flag1的位置,编译器就可以正确地找到flag1的定义。 总之,通过检查符号的定义和引用,确保正确地连接所有需要的文件和声明,就可以解决这个错误。 ### 回答3: 这个错误是由于在timer.o文件中引用了一个未定义的符号"flag1"而导致的。L6218Ekeil MDK编译器的错误代码,指示链接器在连接过程中找不到所需的符号。 要解决这个问题,我们需要查找在哪个地方声明或定义了"flag1"变量,并确保它在连接过程中可见。 首先,我们可以检查timer.o文件中是否有flag1的定义或声明。如果没有的话,可以尝试在timer.o文件中添加extern关键字进行声明,如:extern int flag1;。 如果在timer.o文件中已经有了flag1的定义或声明,那可能是由于没有正确编译相关文件导致的。我们需要检查编译器选项,确保所有需要的源文件都被正确编译且不缺失。 还有一种可能是flag1的定义或声明在其他文件中,我们可以在整个项目中搜索flag1,确保它在正确的位置被定义或声明。 如果以上方法仍然无法解决问题,可能是由于flag1的定义或声明存在错误,例如拼写错误或者类型不匹配等。我们需要仔细检查flag1在项目中的使用情况,找出潜在的问题并进行修复。 总之,解决这个错误需要定位到引用了未定义符号"flag1"的地方,并确保它在连接过程中可见和正确定义或声明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值