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

文章介绍了解决MDK编译STM32工程时出现的SystemInit未定义错误的方法。通过在C文件中定义空的SystemInit函数或注释掉相关汇编调用,可以有效解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考此贴写成,原帖链接 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的函数定义。




### 关于L6218E Undefined symbol NVIC_Init 的原因分析 在使用 Keil MDK-ARM 开发 STM32 项目时,如果遇到 `.axf: Error: L6218E: Undefined symbol NVIC_Init` 类型的错误,通常表明链接器无法找到 `NVIC_Init` 符号的定义。以下是可能导致此问题的具体原因以及解决方案: #### 原因一:缺少必要的头文件或库文件 `NVIC_Init` 是 ST 提供的标准外设库中的函数之一,用于初始化嵌套向量中断控制器(Nested Vector Interrupt Controller)。如果项目的配置中未正确包含标准外设库的相关源码,则可能会导致此类错误。 **解决方案**: 确认是否已将标准外设库的路径添加到项目的 Include 路径设置中,并确保相关源文件被加入到工程目录下。例如,在 STM32F10x 系列中,`nvic.c` 文件应位于 `\Libraries\STM32_Firmware_Library_V3.5.0\Libraries\CMSIS\Device\ST\STM32F1xx\Source\Templates` 或类似的路径中[^1]。 --- #### 原因二:编译选项未启用对应模块 即使包含了正确的头文件和源文件,但如果某些编译选项未正确配置,也可能导致符号丢失。例如,宏定义可能影响了特定功能的可用性。 **解决方案**: 检查项目的预处理器宏定义,确保启用了支持当前 MCU 系列的功能标志。对于 STM32F10x 系列,默认情况下需要定义 `_USE_STDPERIPH_DRIVER` 宏来激活标准外设驱动的支持[^3]。 --- #### 原因三:启动文件冲突或缺失 启动文件(Startup File)负责完成系统的初始引导工作,其中包括调用 `SystemInit()` 函数以及其他低级初始化操作。如果使用的启动文件与目标设备不匹配或者存在语法错误,也会引发类似问题**解决方案**: 验证所选的启动文件是否适合具体的微控制器型号。例如,针对 STM32F103C8T6 应当选用 `startup_stm32f10x_md.s` 启动脚本而非其他变体形式[^4]。 --- #### 示例代码调整 假设您正在构建基于 HAL 库的新项目结构,可以参考如下方式重新整理依赖关系: ```c // main.c 中引入必要组件 #include "stm32f1xx_hal.h" void SystemClock_Config(void); int main(void){ HAL_Init(); // 初始化HAL层资源 SystemClock_Config(); // 配置系统时钟 while(1){ // 主循环逻辑... } } ``` 同时,请注意更新至最新的 HAL 库版本以获得更好的兼容性和稳定性支持[^5]。 --- ### 总结 上述三种情况涵盖了大部分造成 `Undefined symbol` 错误的可能性。通过逐一排查并修正这些问题点,应当能够顺利消除该类链接阶段产生的异常状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值