Error: L6218E: Undefined symbol assert_param (referred from misc.o).

Keil MDK 5编译工程时遇到以下问题:

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第1张图片

不懂就搜,CSDN上也搜到很多的类似问题,需要定义USE_STDPERIPH_DRIVER,STM32F10X_HD

意思需要引入传递给C代码的宏定义,开启某些功能,本着从代码中找到问题的原则,先在工程中搜索一把:

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第2张图片

结果~~~~~

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第3张图片

函数实现的原型找不到,emmm~~

不过在Keil的options for target,也就是编译选项之类的操作界面,如下一顿操作

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第4张图片

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第5张图片

就能去掉assert_param找不到的错误。

这就完了吗?我觉得没有,这两个宏定义在代码中确实有相关的定义,使用时大抵都是下面的样子

可以看到代码中的宏开关:USE_STDPERIPH_DRIVER这个宏定义如果被定义了,就可以包含头文件stm32f2xx_conf.h,

查了其它几个 #ifdef USE_STDPERIPH_DRIVER 并没有什么实质性的东西,就直接追着stm32f2xx_conf.h文件看到下面这些定义

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第6张图片

这不是有对应的assert_param宏实现吗?

编译器就算定义了用户宏定义,也找不到对应的实现,IDE傻掉了?

从上面的代码可以看出,如果需要打开断言,则需要在前面的界面中增加对应宏定义:USE_FULL_ASSERT

 

IDE也有代码符号建立不全的问题,不要过渡相信它~~。Windows下看代码Sourceinsight比较方便,不过最近国内各大公司去A化(减少漂亮国软件依赖),慎重!!

在Linux下grep命令,也可以直接搜到,grep "assert_param" ./ -r | grep "define" 就可以过滤出来,缺点是Linux下编译代码不直观,还需要CMake或Makefile加持,入门难度稍大。

正如下面这个代码实现

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第7张图片

但是如果改成下面这样实现就没有告警信息:

Error: L6218E: Undefined symbol assert_param (referred from misc.o)._第8张图片

如果编译选项打开-Wall,将告警信息当做错误处理,代码就编译不过了~~,有点莫名其妙。

         armcc编译器不是收费的吗?就这~

 

至此:错误都是有来源的,耐心找找就能发现问题,所有问题都来自代码。

你可能感兴趣的:(调测)