你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是MCUXpresso IDE下添加C++源文件進SDK工程編譯的方法。c++
最近有客戶反映在MCUXpresso IDE下的SDK工程裏添加一些.cpp後綴的源文件,該.cpp源文件裏的函數沒法被工程正常編譯連接,只能把工程抽離出來而後利用MCUXpresso工具鏈配合makefile手動編譯才行。微信
痞子衡在MCUXpresso IDE下快速試了這個問題,確實如客戶反映那樣,沒法直接編譯.cpp文件,這跟痞子衡在IAR/Keil MDK工程下經驗不一致,在IAR/Keil MDK工程裏添加.cpp源文件和.c源文件流程是同樣的,IDE角度不須要什麼特殊設置。app
MCUXpresso IDE功能實際上是很是強大的,痞子衡不相信它沒法直接編譯.cpp文件,所以折騰了一番,終於能正常編譯.cpp文件了,特此將經驗分享給你們。ide
首先須要準備好測試環境,包含必要的軟件,痞子衡的環境以下:函數
用MCUXpresso IDE打開經典的 \SDK_2.8.2_EVK-MIMXRT1010\boards\evkmimxrt1010\demo_apps\hello_world 例程,嘗試Build一次,能夠在Console窗口看到所有的Build信息:工具
其實掃一眼Console窗口裏的信息對於理解MCUXpresso IDE工程流程頗有幫助,其實總結下來就是以下三步分離的命令,只不過IDE自動按序執行了這些分離的命令:post
**** Build of configuration Debug for project evkmimxrt1010_hello_world **** make -r -j4 all // 步驟一:激活C編譯器按序編譯工程內全部源文件(.c)生成對應重定向文件(.o) Invoking: MCU C Compiler arm-none-eabi-gcc -std=gnu99 -D__REDLIB__ // 略去一些工程宏、文件路徑 Building file: ../source/hello_world.c ... Finished building: ../source/hello_world.c // 步驟二:激活連接器連接全部重定向文件(.o)生成可執行文件(.axf) Building target: evkmimxrt1010_hello_world.axf Invoking: MCU Linker arm-none-eabi-gcc -nostdlib -Xlinker // 略去一些參數 -T evkmimxrt1010_hello_world_Debug.ld -o "evkmimxrt1010_hello_world.axf" // 略去全部.o文件 Finished building target: evkmimxrt1010_hello_world.axf // 步驟三:執行post build將可執行文件(.axf)轉成鏡像文件(.bin) make --no-print-directory post-build Performing post-build steps arm-none-eabi-size "evkmimxrt1010_hello_world.axf"; # arm-none-eabi-objcopy -v -O binary "evkmimxrt1010_hello_world.axf" "evkmimxrt1010_hello_world.bin" ; Build Finished. 0 errors, 0 warnings. (took 15s.851ms)
爲了測試方便,痞子衡直接寫了個簡單的sw_delay()軟延時函數,放到以下sw_delay.cpp/h源文件中,這兩個新增源文件被放在了\MCUXpressoIDE_11.2.0_4120\workspace\evkmimxrt1010_hello_world\source 目錄下,而後在工程hello_world.c文件裏增長一句sw_delay()的調用代碼。測試
////////////////sw_test.cpp//////////////// #include "sw_delay.h" void sw_delay(uint32_t n) { while (n != 0U) { n--; } } ////////////////sw_test.h//////////////// #include <stdint.h> #if defined(__cplusplus) extern "C" { #endif void sw_delay(uint32_t n); #if defined(__cplusplus) } #endif
如今開始從新Build加了sw_delay.cpp文件的工程,獲得以下錯誤,這個錯誤就是找不到sw_delay()函數定義,由於sw_delay()函數代碼被放在.cpp文件中(若是是放在.c文件中,編譯一切正常),翻看所有編譯log,並無找到關於sw_delay.cpp文件的編譯信息,看起來就像是.cpp文件被自動忽略了。ui
在第二節裏咱們分析過Build信息,對於.c文件的編譯都是經過激活MCU C Compiler來實現的,如今.cpp文件被自動忽略了,估計是沒有使能C++編譯器,那咱們來開啓一下C++編譯器,在.project文件中增長一句代碼便可,具體以下:spa
那句開啓C++編譯器的代碼是馬上生效的,不須要關掉重開IDE工程。如今讓咱們再次Build工程,此時編譯log裏已經有了sw_delay.cpp的身影,彷佛大功告成了。
事情沒有那麼簡單,雖然.cpp文件可以編譯了,但工程最終Build發生了更多錯誤,log裏信息上來看是連接階段找不到代碼裏調用的一些c標準庫函數以及連接文件裏定義的一些段名和stack名等,看起來是連接文件有問題。
打開工程屬性設置,在C/C++ Build的Settings下面能夠看到激活C++編譯器後,新增了MCU C++ Compiler選項,而且MCU C Linker選項升級成了MCU C++ Linker選項,可是MCU C++ Linker選項裏沒有指明Linker Script(原本MCU C Linker選項裏有連接文件),這時候咱們只要勾選Manage linker script,即可以設好連接文件。
Apply屬性設置以後,再次重編工程,終於看到0 errors, 0 warnings了,爲了確保萬一,能夠在map文件裏查看是否有sw_delay()函數,存在即說明.cpp文件確實被正常編譯連接了。
最後還須要提醒一下,若是cpp文件也依賴一些路徑和宏,須要把這些路徑和宏填到MCU C++ Compiler選項對應設置裏,默認路徑和宏定義都是空的。
至此,MCUXpresso IDE下添加C++源文件進SDK工程編譯的方法痞子衡便介紹完畢了,掌聲在哪裏~~~
文章會同時發佈到個人 博客園主頁、CSDN主頁、知乎主頁、微信公衆號 平臺上。
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就能夠在手機上第一時間看了哦。