用CubeMX創建的MDK-ARM環境下增加自己的執行檔(.cpp)與標頭檔(.h)

Silas
Feb 20, 2021

最近這幾天剛好在研究STM32,在研究中遇到了匯入.cpp檔與.h檔的Library時主程式(main.c)會沒辦法編譯的問題,發現是建置環境要在C++的環境下,因此找了許多方法來修改建置環境,在此紀錄我解決這問題的過程

在我將第三方函式庫加入Keil中,並在main.c當中呼叫時出現了以下錯誤:

一開始以為是我用錯誤的方式匯入了Keil,後來在多次嘗試之後發現,main.c的建置環境是用C的編譯器去編譯,所以在main.c當中使用C++的語法會出現錯誤,因此要做一些動作來修改main.c的建置環境,修改成C++之後就能使用第三方函式庫了

  1. 因為我是使用CubeMX生成程式碼的HAL庫模式,因此首先在建置程式碼前有幾點要注意
    CubeMX在GENERATE CODE前在Project Manager的頁面下的Code Generator分支中,Generated files中的"Generate peripheral initialization as pair of ‘.c/.h’ files per peripheral"『不要』勾選
此選項『不要』勾選

一旦勾選下去,CubeMX會將生成的所有代碼當作是C編譯,因此有些只能用C編譯器編譯的程式碼不會用extern “C”來作保護,如果不勾選,CubeMX就會當作是我們會有其他的編譯器,因此會有extern "C"來保護

(2021/2/23更新)↑那是於2019年1月還發現的bug

由於未勾選這功能會造成所有初始化都放在main.c當中,當開啟某些功能時,會沒辦法產生新的.c檔案,造成編排上面的問題(目前知道開始USTAR功能時ustar.c不會產生)

因此,目前解決辦法:『依然勾選此功能,但當檔案調整成C++編輯器編譯時出現問題時,請將出現問題的程式碼加上extern "C"來做保護』(2021/2/23更新 END)

2. CubeMX生成程式碼後,利用Keil開啟時要設定的地方

(1)要將C++編譯器加入Keil

點擊Options for Target
在C/C++頁面下的Misc Controls中要加上 — cpp11,將C++編譯器加入

(2)要將main.c的編譯器更改成C++

main.c右鍵點擊Options for File’main.c’…
Properties頁面下的File Type要選成C++ Source file

3.1新增自己編寫的第三方程式

(1)如果想要新增新的資料夾目錄,需要使用File Extensions的功能

File Extensions,Books and Envirconment…來增加新的資料夾目錄
利用新增資料夾的方式新增
目錄資料夾右鍵選擇Add New Item to Group '資料夾名稱'...來新增檔案
選擇想創建的檔案類型

注意若創建的為.cpp檔案,一樣需要去調整他的編譯器

右鍵選擇Options for File來調整編譯器
將其調整成C++編譯器

3.2 如果要新增已經有的執行檔與標頭檔

在剛剛新增目錄的右邊Add檔案

4.告訴main.c你的這些標頭檔與執行檔位置

點擊Options for File ‘main.c’…
C/C++頁面下點擊Include Paths,將剛才匯入的檔案位置加入
加入後main.c在include時就不會出現錯誤了

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Silas
Silas

No responses yet