让你的 STM32Cube KEILV5 + HAL库工程支持C++开发

#前言
最近这段时间在弄一个新的STM32F4的项目,因为工程比较庞大,然后各种类型也比较复杂,在封装整理的时候就非常头疼,很想通过C++的类,继承,多态的方式来让代码变得清晰简单。在网上翻阅了比较多的相关资料,发现很多博客所说的方法要么太复杂,要么不能完美兼容Cube。随着ST对HAL库的不断更新,各类驱动包其实都已经悄悄的在各种头文件上加入了 extern “C” 的宏定义,让C++移植更加方便。我也折腾了一段时间,终于成功的编译成功了一个带有C++特性的工程,故来分享一下自己的经验和一些值得注意的地方。因为我也在探索的过程中,如果大家在尝试的过程中有遇到其他问题的欢迎评论区讨论。

#配置C++工程
##配置Cube
其实在Cube的配置上没有多大改变,只建议尽量不要在生成工程的时候不要选中Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral选项。这个感觉像是cube的一个遗漏的地方,如果在此处勾选了这个选项的时候,有部分新增加的头文件没有extern “C” 的宏定义 会导致混合编译出错。
这里写图片描述
其他的地方没有什么特别的,直接生成工程即可。
##配置Keil
###工程设置
Keilv5原生是支持C++的编译的,所以在keil里面我们只需要打开工程设置,在C/C++选项里的Misc_Controls里加入–cpp 当然如果原意使用C++11标准的话可以加入 --cpp11 即可.
然后我们还需要确认MicroLib已被禁用。该选项在工程设置中的Target栏的Code Generation里,取消勾选“Use Micro Lib”即可。
###文件属性设置
经过上面的设置之后,我们就可以对cpp类文件使用C++编译器了,可是问题是,Cube给我们生成的都是.c文件,这就导致Keil会把它们当做c文件,使用C编译器编译,当我们在这些cube生成好的文件里面使用C++特性的时候就会报错了。所以我们需要把Cube给我们生成的文件改成C++文件。但是在此处不宜用更改文件名后缀的方法,因为这样的话会导致cube以后在修改的时候不会维护.cpp文件,而是重新给你生成一个.c文件。为了保证cube的维护性,我们在keil的工程目录中选中需要使用C++特性的文件,右键点击 “Options for File ‘xxx.c’”,打开后将File Type里设置为C++ Source File即可 这样即使是.c后缀 keil也会将它认为C++文件进行编译链接. 这样我们就可以将C++嵌入到工程里 并且cube更新的时候这些也不需要重新设置 cube之外的其他用户文件直接使用.cpp .hpp并做好extern “C” 的工作即可,不需要这样设置
这里写图片描述
###一些注意事项
建议只把需要用到C++特性的cube文件设置为C++文件,不要把一些底层的驱动文件也设置成C++文件,因为不知道会有什么未知的影响。我亲身经历了一次把所有的.c文件改成c++源文件类型后编译时错误的绝望…
另外,所有涉及中断的服务函数必须用 extern "C"作前缀(包括定义),因为stm32的中断服务名是由汇编的启动代码内的向量表决定的,汇编不认得C++的函数名的链接符号。建议的方法是在中断配置文件里的开头和结尾(都含有cube的 "user code"段)加上extern "C"的标注。

/------------------------------------------------------------------------------

2018年6月4日11:34:06后记:

STM32Cube其实在悄无声息的对HAL逐渐完善C++的支持 自身体验F103的HAL库 生成工程后 只需要注意中断要extern "C"外 其他的HAL库都处理好了. 所以用C++开发的同学们可以尽量尝试新的库,对C++的支持更优!

猜你喜欢

转载自blog.csdn.net/wmdscjhdpy/article/details/79354513