历史上的今天
今天是:2025年08月01日(星期五)
2019年08月01日 | STM32cubeMX改C/C++混合编译
2019-08-01 来源:eefocus
首先说明一下,本文的开发环境是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
史海拾趣
|
水文遥测系统通常由终端机、中继站和中心站三部分组成。由于终端机是用来直接测量雨量、水位等水文数据,是整个遥测系统信息的来源,故其设计成为整个遥测系统的关键。遥测终端机一般处于河流上游或者湖泊边缘,分布分散,维护起来很不方便,需要长 ...… 查看全部问答> |
|
FPGA 是硬件编程器件,器寄存器的长度理论上没有限制,受限与硬件容量,以及对寄存器的时钟速率要求。比如要实现一个256位的串并转换。只需如下编程即可: din : in std_logic_vector(255 downto 0);   ...… 查看全部问答> |
|
诚聘单片机设计工程师: 1,会msp430,有设计经验 2,有msp430 C语言开发经验 3,懂信号处理,会用matlab 4,最好有工作经验1年以上 电话:010-81504648 公司网站:www.safezx.com 注:工作地点北京… 查看全部问答> |
|
论坛里有谁搞过RGB24 转YUV422吗?? 在网上搜了一下,资料不是很多而且讲的不是很清楚。我看到以下公式,但是YUV的U、V分量不是只有Y的一半吗?按照公式的话U、V分量和Y一样多啊,谁能点拨下我,不胜感激。Y = 0.299 R ...… 查看全部问答> |




