做嵌入式开发时,我们对使用c++语言写的库有强烈的需求,比如eigen,boost等,但是通常来说,我们的开发是围绕c语言进行的,怎么把c++的库文件放在c语言环境下进行编译,就是我们需要面对的问题
1.问题来源:需要把一个用cpp语言写的库放在c语言环境下进行编译。
参考:C++ in Keil 使用指南_keil使用c++-CSDN博客
STM32 C++编程系列一:STM32 C++编程介绍-CSDN博客
KEIL / MDK C++支持方法:基于TencentOS-Tiny 工程修改,STM32芯片_keil c++-CSDN博客
主要的思路是到用一个函数把整个c++函数都引导到C环境里。
开始实操
1.用cubemx生成一个基本的项目,启用一个串口,方便我们调试,其他什么都不开。
2.在arm compiler里选择use default complier version6(use default complier version5 也能用,需要在c/c++(AC5)选项卡里加入-cpp11关键字来启用cpp11支持)
3.在c/c++(ac6)里面把c语言版本和cpp语言版本设置成你所需要的版本,我这里选的是c11/cpp14。
4.引入你所需要的包和相关依赖项
先把源代码引入
再把头文件的路径引入。
5.写一个使用了这个库其中的函数的函数, 有点绕口,就是写一个函数,在里面使用你要用的cpp库的函数,并且写出相关的头文件。这个头文件一定一定要用extern“C”关键字包起来,这样才能被正确识别。
记得把头文件的路径引入,具体引入的方法在上一步,不引入的话会找不到头文件。
6.这时候编译基本上只要配置正确,就没什么error,然后下载入板子调试,会遇到以恶很经典的问题
【 BEAB BKPT 0XAB】,这是因为进入了半主机模式,下面这篇文章有相关的内容
STM32 C++编程系列2.5:让Keil MDK工程支持现代C++特性及填坑_stm32 支持c++-CSDN博客怎么解决这个问题,三个办法,第一如果我们在用纯c代码的时候,我们可以勾选mcriolib,第二,重写target.c文件,第三,我们选择keil官方补丁,上面这个问咋是第三种办法,我们采用第二种办法。
7.重写target.c文件
KEIL / MDK C++支持方法:基于TencentOS-Tiny 工程修改,STM32芯片_keil c++-CSDN博客
我们按照这篇文章来进行改写。
8.如果你的cpp文件所需的内存空间很大,这时候你需要修改堆栈大小,或者使用内存管理,这篇文章讲了一下。到此,你应该就可以在keil种使用c/cpp混合编程了。
STM32 C++编程系列2.5:让Keil MDK工程支持现代C++特性及填坑_stm32 支持c++-CSDN博客