如何在keil上进行c/c++混合编译
最近由于尝试在mcu上导入一个c++的算法库,而原有的工程是以c为基础的,在两边都不想改动的情况下,尝试在keil上进行c/c++混合编译。在这个过程中遇到了一些坑,所以简单记录一下,也供大家参考。
1. 切换编译器版本到AC6

由于AC5支持的c++版本较老,为了支持C++11以后的特性,我们选择切换到AC6的编译器。microlib不支持使用c++,所以我们需要取消Use MicroLib的勾选项
2. 禁用半双工模式
由于我们取消了microlib的使用,会导致与io相关的一些函数缺失,此时如果直接使用,会导致进入半主机模式,此时程序无法直接在mcu上运行,仅在debug模式下能够手动跑起来。
所以我们尝试主动禁用半主机模式,并且将设计io处理的一些函数进行定义。由于我需要使用printf进行打印,所以还在此处添加了printf的重定向。如果不用printf,可以忽略fputc相关的定义。

3. 生成retarget_io.c
经过上面的操作后,如果没有使用fopen相关的函数,应该可以正常使用了。但是当fopen之类的函数被使用时,会提示_sys_open函数被调用,报错如下。
AC6 : Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_open was referenced
此时如果你尝试使用上述的方法定义_sys_open(),则会提示你_sys_open重定义。所以我们需要使用官方的重定向功能

勾选完成后,会在项目里生成一个retarget_io.c

此时再进行编译,将顺利通过,并且可以丝滑的使用c++的各种特性啦。
浙公网安备 33010602011771号