STM32cubeMX改C/C++混合编译

首先说明一下,本文的开发环境是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上

https://github.com/MagicPrince666/stm32f103c8.git

你可能感兴趣的:(嵌入式,stm32,stm32cubemx)