在编译keil5 工程时出现报错:
xxx.axf: Error: L6218E: Undefined symbol xxx (referred from xxxo).

正常情况下遇到Undefined symbol问题根据经验有以下几种原因:
1:c文件中未定义
2:未在工程中添加该c文件
3:头文件未引用及函数参数不对

但是在检查了以上几种原因后还是会报错,花了一定时间排查问题终于找到了原因,原来是C++和C 混合编译时出现的问题,解决方法如下:
在c文件对应的头文件中加上字体加粗内容
#ifndef __XXX_H
#define __XXX_H

#ifdef __cplusplus
extern “C” {
#endif

//代码

#ifdef __cplusplus
}
#endif

#endif

再编译就成功了。

出现此问题是c++之所以可以重载函数是因为它编译的时候生成的函数名会格外加上它的类型和参数等信息。但是C仅仅生成函数名。所以虽然编译通过了,但是链接的时候,会认为是两个函数,所以会链接失败。

知识引申:

__cplusplus 是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern “C”{}处理其中的代码。

在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.

试想这样的情况:一个库文件已经用C写好了而且运行得很良好,这个时候我们需要使用这个库文件,但是我们需要使用C++来写这个新的代码。如果这个代码使用的是C++的方式链接这个C库文件的话,那么就会出现链接错误。因此,为了在C++代码中调用用C写成的库文件,就需要用extern “C”来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。