1. 程式人生 > >STM32cubeMX改C/C++混合編譯

STM32cubeMX改C/C++混合編譯

首先說明一下,本文的開發環境是linux,基於STM32cubeMX生成工程新增C++部分程式碼和選項。寫給微控制器開發windows轉linux新手,高手略過。

cubeMX生成工程預設是C語言,還有一部分彙編。

首先加入file.cpp到工程,在Middlewares下新建cxxsource資料夾,當然也可以在你喜歡的位置新增。將C++程式碼拷貝到cxxsource/。

在Makefile  C_SOURCES後面增加,參與編譯

# CPP sourcesCXX_SOURCES = \Middlewares/cxxsource/ringbuffer.cpp \Middlewares/cxxsource/line.cpp \
Middlewares/cxxsource/uart_process.cpp

在編譯工具鏈選項新增g++編譯選項

######################################## binaries#######################################BINPATH = PREFIX = arm-none-eabi-CC = $(BINPATH)$(PREFIX)gccCXX = $(BINPATH)$(PREFIX)g++ #add g++AS = $(BINPATH)$(PREFIX)gcc -x assembler-with-cppCP = $(BINPATH
)$(PREFIX)objcopyAR = $(BINPATH)$(PREFIX)arSZ = $(BINPATH)$(PREFIX)sizeHEX = $(CP) -O ihexBIN = $(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++ objectsOBJECTS += $(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 [email protected]

在此大功告成,你的工程已經可以編譯C++程式碼了。

然而還要注意一下,提供給C呼叫的介面一定要符合C標準,並且在標頭檔案宣告

#ifdef__cplusplusextern "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上

相關推薦

MATLAB和C++編譯器混合編譯:Xcode 8的不相容錯誤

最近在看tracking方面的論文和程式碼,發現大多數都是用matlab和c++混合編譯的。對於linux和windows這兩個系統,暫時還沒有碰到編譯器不相容的問題,但是mac上面卻有問題,在命令列裡輸入: mex -setup 會有下面的錯誤提示:

CC++的混合編譯--extern “C”的使用

參考地址:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 在實際程式設計中,有時會需要用到C\C++的混合編譯,通過extern “C”即可實現混合編譯,以下是個人蔘照網友的資料以及自己的實際操作

STM32cubeMXC/C++混合編譯

首先說明一下,本文的開發環境是linux,基於STM32cubeMX生成工程新增C++部分程式碼和選項。寫給微控制器開發windows轉linux新手,高手略過。cubeMX生成工程預設是C語言,還有一部分彙編。首先加入file.cpp到工程,在Middlewares下新建c

16bit C & ASM 如何混合編譯

.exe 資料 bit urb 價值 nmake 開發 include 生成 起源: 今天在看以前沒看完的一本書《圖形程序開發人員指南》,在做裏面的例子。 第一章就出問題了,一個例子“L1_2.c, L1_3.asm" ,這是C程序和ASM匯編程序的混合編譯

c++與matlab混合編譯———讀取mxArray內容

            mxArray作為一種特殊且複雜的資料結構,需要通過matrix.h提供的相關介面去訪問。在混合編譯過程中,matlab變數以mxArray形式儲存,通常用mxArray* 型別來指定matlab工作空間變數的地

VS2010中CUDA和C++混合編譯(兩種方式)

在做專案整合的時候需要用到cpp和cuda檔案聯調,自己摸索了兩種方式實現cpp和cu檔案混合編譯。 本文環境: windows7 64位VS2010CUDA5.5英偉達顯示卡Tesla C1060 前言 裝好CUDA 5.5 sdk後,預設會自動新增好系統環境變數

CC++混合編譯

C語言與C++的函式編譯後的命名規則不同,因此在C++工程中直接引用C實現的原始碼會存在“undefined reference”問題,即找不到函式的實現。 因此,在C的標頭檔案前,應使用extern “C”提示編譯器,該程式碼是使用C語言進行編寫的,如以下形式: ext

VS2010 CUDA和C++混合編譯

在做專案整合的時候需要用到cpp和cuda檔案聯調,自己摸索了兩種方式實現cpp和cu檔案混合編譯。 本文環境: windows7 64位VS2010CUDA5.5英偉達顯示卡Tesla C1060 前言 裝好CUDA 5.5 sdk後,預設會自動新增好系統環境變數。 因此不需要額外配置,不過

Cmake+Ubuntu+CUDA+C混合編譯

一. 環境Jetson TK1 開發套件+Ubuntu 14.04Cmake安裝:sudo apt-get install cmake二.示例1.目錄樹2.原始碼/cuda/cube.cu#include "cuda_runtime.h" #include "device_l

混合編譯c++檔案呼叫c檔案變數和函式、c檔案呼叫c++檔案變數和函式

1.c++檔案呼叫c檔案變數和函式 前言:以前見到extern "C"這樣的語句,只是簡單地知道跟外部連結有關,但是沒有深刻理解它的意思。 首先,為什麼要使用extern "C"修飾符? C++呼叫其它語言的函式,由於編譯器生成函式的機制不一樣,所以需要經過特殊處理,才可以

C++靜態庫編譯

opencv ng- res tracking mic gdi end jasper debug模式 MFC 選項選擇: 靜態庫編譯 增加頭文件:( opencv相關的) #pragma once #ifdef WIN32 #include <open

gcc g++支持C++11 標準編譯及其區別

包含 別名 glob sin 你會 con 並且 c++程序 轉換成 g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次寫這個-std=C++11這個選項該怎麽辦呢?   方法出

c++文件編譯的一些說明

動態 內部 完全 ++ 處理 dll文件 linux 註冊 dll 1,頭文件只在於預處理階段用於完全包含該頭文件的內容,每個c文件是一個編譯單元,類定義和類聲明,變量和函數聲明,類內聯實現是內部鏈接,全局變量和函數的定義以及類外部實現是具有全局鏈接性,假設將所有c單元合並

如何在Windows命令行(DOS界面)中調用 編譯器 來編譯C/C++源程序

開發 common window include span 能夠 microsoft ogr 一個 首先說明一下背景: 為什麽要在DOS界面編譯C/C++源程序?有很多現成的開發環境(IDE)如:vs, vc++等,這些開發環境集成了編譯,調試,使用起來很方便,而且圖形化操

Sublime Text3 & MinGW & LLVM CLang 安裝配置C-C++編譯環境

his c/c++ 而已 rtl sha2 9.png 大寫 utf8 實的 Sublime Text是一款強大的跨平臺代碼編輯器,小巧而且豐富實用的功能是Visual Studio不能比擬的,但是編譯運行是一個軟肋,本文通過在sublime中配置g++編譯器實現程序的編譯

C語言/原子/編譯,你真的明白了嗎?

clas done ati pre 內存 程序 導致 裏的 creat   說到原子,類似於以下的代碼可能人人都可以看出貓膩。 #include <stdio.h> #include <pthread.h> int cnt = 0;

vscode基於Linux和Windows下c/c++的多文件編譯與連接

vscode c/c++ 有時寫寫小程序,又不想啟動2013,vscode就成了我的首選。剛接觸vscode的時候,跟著網上配置了一堆東西,總算能編譯C/C++了,但一涉及到多文件,我還得乖乖的打開vs2013。前些天在配置Linux上的vscode的時候,突然發現有網友在tasks.json

C#添加編譯時間

-a too name lec orm getc https sta msd using System.Reflection;using UnityEngine;using System.Collections;[assembly:AssemblyVersion( "1.0

C/C++預處理指令#define,條件編譯#ifdefine

明顯 int 生效 cpp 這樣的 ffffff 給定 ron fde 本文主要記錄了C/C++預處理指令,常見的預處理指令如下: #空指令,無任何效果 #include包含一個源代碼文件 #define定義宏 #undef取消已定義的宏 #if如果給定條件為真,則編譯下面

免費的 C/C++ 編譯&解釋 器列表

mac wait compile clas rbo art apple blank gin 摘自《C++編程網》,詳細介紹請參考http://www.cpp-prog.com/2009/0520/118.html MicrosoftVisual C++ 2008 Expr