[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o).

目录

  • 1 问题说明
    • 1.1 问题回顾
    • 1.2 寻找解答所犯的错误
  • 2 解决办法(试用于一系列问题)
    • 2.1 重审问题
      • 2.1.1 Undefined symbol xxx.c
      • 2.1.2 referred from xxxx.o
    • 2.2 解决步骤
      • 2.2.1 如何寻找xxxx.c的位置?
      • 2.2.2 相同办法全局搜索没有定义的“xxx.c”符号
      • 2.2.3 继续分析
      • 2.2.4 再次编译
  • 3 一点说明
    • 3.1 为什么全局域搜索可以找到“cortex.h”中也存在这个函数?
    • 3.2 我为什么写这篇博客?

1 问题说明

1.1 问题回顾

学习自己手动搭建一个STM32HAL库工程模板文件的时候,我发现了有6个错误,6个错误的类型是一样的,其中有3个通过添加hal_rcc.h和hal_gpio.c文件得以解决。所以另外3个我也想到了时缺少了对应的.c文件导致的错误。
但是在STM32F1xx_HAL_Driver文件夹中,我没有找到类似如有“rcc”和“GPIO”这样的标志性符号。这3个错误如下:
在这里插入图片描述
分别是HAL_NVIC_SetPriorityHAL_NVIC_SetProtityGroupingHAL_SYSTICK_Config
STM32F1xx_HAL_Driver文件夹中未找到类似于“NVIC”或者“SYSTICK”的.c文件。
copy了问题在网上也没有找到合适的回答,因为我根本不知道如何描述我的问题。找了一个学长问了之后,他只用了5分钟就帮我解决了问题

1.2 寻找解答所犯的错误

这个问题的解决,在互联网上是无法找打解答的,因为无法描述其问题。打个比方就是:

一个人要煮方便面,但是家里没有锅。于是,这个在网上搜索为什么这个面煮不开。这个问题在互联网上无法回答。
但是,因为煮面过程中,先放调料还是先放面,影响了最后的口感,这个时候是可以在网上询问:怎么煮面更好吃。其他网友才能回复自己的煮面方法。方法并不包括考虑这个提问者是不是家里有锅。

2 解决办法(试用于一系列问题)

2.1 重审问题

…\Output\Template.axf: Error: L6218E: Undefined symbol HAL_NVIC_SetPriority (referred from stm32f1xx_hal.o).

问题中有两个关键词,我们一个一个看

2.1.1 Undefined symbol xxx.c

含义是:“xxx.c”这个符号,没有被定义

2.1.2 referred from xxxx.o

含义是:上面的“xxx.c”文件在xxxx.o中被调用过

“.o”文件是什么?
.o文件在工程里面是没有的,它是在编译过程中由.c文件生成的。所以我们只需要找到工程里面的.c文件即可,这里对应这个名字的就是 xxxx.c 了

2.2 解决步骤

2.2.1 如何寻找xxxx.c的位置?

step1:Ctrl+F弹出搜索框
step2:在Find in Files选项卡中搜索xxxx.c文件
[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)._第1张图片
step3:在keil下方会返回在整个工程文件中找到该文件的位置
在这里插入图片描述
step4:从左侧任务栏中会找到,这个xxxx.c文件已经存在
[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)._第2张图片

2.2.2 相同办法全局搜索没有定义的“xxx.c”符号

得到了以下回复:
在这里插入图片描述
出现了HAL_NVIC_SetPriority的.c文件和.h文件有:hal_gpio.c、hal.c和cortex.h

2.2.3 继续分析

从左侧任务栏,可知hal_gpio.c和hal.c已经添加进入工程文件了
[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)._第3张图片
寻找一下hal_cortex.h文件
[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)._第4张图片
可见,在hal_cortex.h文件中,我们找到了对应函数的声明,缺少了定义,因此需要把hal_cortex.c的文件添加进入工程文件中。
[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)._第5张图片

2.2.4 再次编译

在这里插入图片描述
发现所有错误全部解决,说明问题“HAL_SYSTICK_Config”的声明和定义也是在“cortex.h”和“cortex.c”中完成的。
至此,问题解决了。

3 一点说明

3.1 为什么全局域搜索可以找到“cortex.h”中也存在这个函数?

原因有两个:
1、打开魔术棒,打开C/C++选项卡,按步骤打开,会发现,我们在之前已经把存储的路径保存了
[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)._第6张图片
2、虽然我们没有把“cortex.c”文件放进工程文件,目的是节约编译时间不用把所有hal库文件都放进工程中,但是在“stm32fxx_hal.c”中又调用了所有hal库的“.h”文件。所以在检索的时候,keil可以发现并找到搜索的函数和位置
[STM32问题解决(1)]类型问题解决编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)._第7张图片

3.2 我为什么写这篇博客?

1、这个问题是一个非常意外的问题,在互联网上,我暂时还没找到。
2、这种解决问题的思路是我的一个学长教给我的,以前遇到问题我只会在网络检索,现在需要学习直接解决问题的办法和方式步骤。因此,我把它进行了梳理并整理了出来。
3、如何手动搭建一个hal库的工程模板,而不使用cubemx,在之后的博客中,我会再次分享我的经验。

你可能感兴趣的:(嵌入式学习笔记,stm32,单片机,arm)