首先说明一下,本文的开发环境是linux,基于STM32cubeMX生成工程添加C++部分代码和选项。写给单片机开发windows转linux新手,高手略过。
STM32cubeMX生成Makefile工程步骤,以及Linux环境搭建,请参考我上一篇博文https://blog.csdn.net/u013908686/article/details/79883904,本文着重讲解添加C++代码的过程。
cubeMX生成工程默认是C语言,还有一部分汇编。
首先加入file.cpp到工程,在Middlewares下新建cxxsource文件夹,当然也可以在你喜欢的位置添加。将C++代码拷贝到cxxsource/。
在Makefile C_SOURCES后面增加,参与编译
# CPP sources
CXX_SOURCES =
\
Middlewares/cxxsource/ringbuffer.cpp
\
Middlewares/cxxsource/line.cpp
\
Middlewares/cxxsource/uart_process.cpp
在编译工具链选项添加g++编译选项
#######################################
# binaries
#######################################
BINPATH =
PREFIX = arm-none-eabi-
CC =
$(
BINPATH
)$(
PREFIX
)gcc
CXX =
$(
BINPATH
)$(
PREFIX
)g++
#add g++
AS =
$(
BINPATH
)$(
PREFIX
)gcc -x assembler-with-cpp
CP =
$(
BINPATH
)$(
PREFIX
)objcopy
AR =
$(
BINPATH
)$(
PREFIX
)ar
SZ =
$(
BINPATH
)$(
PREFIX
)size
HEX =
$(
CP
) -O ihex
BIN =
$(
CP
) -O binary -S
增加C++头文件目录,将引用到的C头文件目录也包含进来
CXX_INCLUDES =
\
-IMiddlewares/cxxsource
\
-IMiddlewares/HARDWARE/include
CFLAGS后面增加CXXFLAGS
CXXFLAGS = -lstdc++
$(
CFLAGS
)
$(
CXX_DEFS
)
$(
CXX_INCLUDES
) -g -ggdb3 -fno-rtti -fno-exceptions
\
-fverbose-asm -fdata-sections -ffunction-sections -fpermissive -Wa,-ahlms=
$(
BUILD_DIR
)/
$(
notdir
$(
<:.cpp=.lst
))
编译选项中增加C++编译选项
# list of c++ objects
OBJECTS +=
$(
addprefix
$(
BUILD_DIR
)/,$(
notdir
$(
CXX_SOURCES:.cpp=.o
)))
vpath %.cpp
$(
sort
$(
dir
$(
CXX_SOURCES
)))
以及
$(
BUILD_DIR
)/%.o: %.cpp Makefile |
$(
BUILD_DIR
)
$(
CXX
) -c
$(
CXXFLAGS
)
$< -o
$@
在此大功告成,你的工程已经可以编译C++代码了。
然而还要注意一下,提供给C调用的接口一定要符合C标准,并且在头文件声明
#ifdef
__cplusplus
extern
"C" {
#endif
void
Uart_RecvBuffTask(
void
const * argument);
#ifdef
__cplusplus
}
#endif
给C调用,C不能直接使用C++对象。
引用到的C头文件,也要做好声明,这是一个C头文件
extern
"C"
{
#include
"dma.h"
#include
"led.h"
#include
"timer.h"
#include
"24l01.h"
#include
"mpu6050.h"
#include
"stmflash.h"
}
最后放一组参考的代码在github上