1. 程式人生 > >痞子衡嵌入式:MCUXpresso IDE下新增C++原始檔進SDK工程編譯的方法

痞子衡嵌入式:MCUXpresso IDE下新增C++原始檔進SDK工程編譯的方法

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**MCUXpresso IDE下新增C++原始檔進SDK工程編譯的方法**。   最近有客戶反映在MCUXpresso IDE下的SDK工程裡新增一些.cpp字尾的原始檔,該.cpp原始檔裡的函式無法被工程正常編譯連結,只能把工程抽離出來然後利用MCUXpresso工具鏈配合makefile手動編譯才行。   痞子衡在MCUXpresso IDE下快速試了這個問題,確實如客戶反映那樣,無法直接編譯.cpp檔案,這跟痞子衡在IAR/Keil MDK工程下經驗不一致,在IAR/Keil MDK工程裡新增.cpp原始檔和.c原始檔流程是一樣的,IDE角度不需要什麼特殊設定。   MCUXpresso IDE功能其實是非常強大的,痞子衡不相信它無法直接編譯.cpp檔案,因此折騰了一番,終於能正常編譯.cpp檔案了,特此將經驗分享給大家。 ### 一、準備實驗環境   首先需要準備好測試環境,包含必要的軟體,痞子衡的環境如下: > * 整合開發環境: MCUXpresso IDE v11.2.0_4120,[點此下載](https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE) > * 軟體開發包: SDK_2.8.2_EVK-MIMXRT1010(Toolchain需包含MCUXpresso IDE),[點此下載](https://mcuxpresso.nxp.com/en/welcome) ### 二、檢視工程Build資訊   用MCUXpresso IDE開啟經典的 \SDK_2.8.2_EVK-MIMXRT1010\boards\evkmimxrt1010\demo_apps\hello_world 例程,嘗試Build一次,可以在Console視窗看到全部的Build資訊: ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_noCpp.PNG)   其實掃一眼Console窗口裡的資訊對於理解MCUXpresso IDE工程流程很有幫助,其實總結下來就是如下三步分離的命令,只不過IDE自動按序執行了這些分離的命令: ```text **** 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) ``` ### 三、新增c++原始檔編譯報錯   為了測試方便,痞子衡直接寫了個簡單的sw_delay()軟延時函式,放到如下sw_delay.cpp/h原始檔中,這兩個新增原始檔被放在了\MCUXpressoIDE_11.2.0_4120\workspace\evkmimxrt1010_hello_world\source 目錄下,然後在工程hello_world.c檔案裡增加一句sw_delay()的呼叫程式碼。 ```C ////////////////sw_test.cpp//////////////// #include "sw_delay.h" void sw_delay(uint32_t n) { while (n != 0U) { n--; } } ////////////////sw_test.h//////////////// #include #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檔案被自動忽略了。 ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_withCpp.PNG) ### 四、讓MCUXpresso IDE正確編譯C++檔案 #### 4.1 啟用C++編譯器   在第二節裡我們分析過Build資訊,對於.c檔案的編譯都是通過啟用MCU C Compiler來實現的,現在.cpp檔案被自動忽略了,估計是沒有使能C++編譯器,那我們來開啟一下C++編譯器,在.project檔案中增加一句程式碼即可,具體如下: ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_add_ccnature.PNG)   那句開啟C++編譯器的程式碼是立刻生效的,不需要關掉重開IDE工程。現在讓我們再次Build工程,此時編譯log裡已經有了sw_delay.cpp的身影,似乎大功告成了。 ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_can_build_cpp.PNG) #### 4.2 為C++連結器指明連結檔案   事情沒有那麼簡單,雖然.cpp檔案能夠編譯了,但工程最終Build發生了更多錯誤,log裡資訊上來看是連結階段找不到程式碼裡呼叫的一些c標準庫函式以及連結檔案裡定義的一些段名和stack名等,看起來是連結檔案有問題。 ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_link_cpp_error_v2.PNG)   開啟工程屬性設定,在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,便可以設好連結檔案。 ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_add_cpp_linker.PNG)   Apply屬性設定之後,再次重編工程,終於看到0 errors, 0 warnings了,為了確保萬一,可以在map檔案裡檢視是否有sw_delay()函式,存在即說明.cpp檔案確實被正常編譯連結了。 ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_cpp_func_in_map.PNG) #### 4.3 為C++編譯器設定引用路徑和巨集(可選)   最後還需要提醒一下,如果cpp檔案也依賴一些路徑和巨集,需要把這些路徑和巨集填到MCU C++ Compiler選項對應設定裡,預設路徑和巨集定義都是空的。 ![](http://henjay724.com/image/cnblogs/MCUX_IDE_CompileCpp_HelloWorld_c_cpp_include.PNG)   至此,MCUXpresso IDE下新增C++原始檔進SDK工程編譯的方法痞子衡便介紹完畢了,掌聲在哪裡~~~ ### 歡迎訂閱 文章會同時釋出到我的 [部落格園主頁](https://www.cnblogs.com/henjay724/)、[CSDN主頁](https://blog.csdn.net/henjay724)、[知乎主頁](https://www.zhihu.com/people/henjay724)、[微信公眾號](http://weixin.sogou.com/weixin?type=1&query=痞子衡嵌入式) 平臺上。 微信搜尋"__痞子衡嵌入式__"或者掃描下面二維碼,就可以在手機上第一時間看了哦。 ![](http://henjay724.com/image/github/pzhMcu_qrcode_258x2