keil 5 : Error: L6218E: Undefined symbol 问题解决方法小记

最近学习嵌入式开发,因项目框架较大,部分内容改动,在将别人单独写的串口读取数据源码添加到工程中后,编译出现以下问题:

通过查询资料,都是在说未定义引下的错误。

回头检查项目,源文件加入到工程,头文件也已包含。而后多次尝试编译,未果;关闭重启,亦未果。。。

询求正点原子技术支持,远程协助,还是未能解决。。。

编译通不过,调试无法进行,苦恼一天。。。。

后来,多次将源文件多项目中删除后重新添加,无意间发现,项目中的源文件既有*.c,也有*.cpp,也就是说有的是用C语言写的,有的是用C++写的程序。于是乎,上网查了下在keil中两种语言的使用区别,发现keil工程同时有c文件和CPP文件时,c文件的函数在cpp文件中是无法直接访问的。

也就是说,正常的include“”xxx.h“”那肯定是不行的,编译会提示说未定义错误。原来如此!!!我的工程是C++文件调用C文件中的函数,所以即使源文件添加了,也出现未定义错误。根据网上提供的解决方法,将

#include "XXX.h"  改为

extern "C"

{

#include "XXX.h"

}  

keil 5 : Error: L6218E: Undefined symbol 问题解决方法小记_第1张图片

然后再编译, 0 Error(s), 0 Warning(s).  OK !!

总结:

1.一般情况下,Error: L6218E: Undefined symbol 若是由于未定义引起的错误,可以根据错误提示定位到相应的问题行,然后将相应的函数进行定义即可,网上大多也都是针对这种情况下的未定义错误进行解答;

2.如未将.c/.cpp源文件添加到工程中,也会出现此错误;

 

3.若工程中已经添加了源文件,也包含了相应的头文件,依然出现错误 Error: L6218E: Undefined symbol ,则检查是否是由于在Keil中混用C和c++引起的。这种情况下,除了像上述那样在源文件中包含头文件外,还可以在头文件中使用

#ifdef __cplusplus    
extern "C" {         
#endif

void  xxxxx(xxx)

#ifdef __cplusplus
}
#endif

这样的条件编译,在源文件中直接使用#include ""包含头文件亦可。

keil 5 : Error: L6218E: Undefined symbol 问题解决方法小记_第2张图片

你可能感兴趣的:(keil 5 : Error: L6218E: Undefined symbol 问题解决方法小记)