痞子衡嵌入式:MCUXpresso IDE下添加C++源文件進SDK工程編譯的方法


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是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

1、準備實驗環境

  首先須要準備好測試環境,包含必要的軟件,痞子衡的環境以下:函數

  • 集成開發環境: MCUXpresso IDE v11.2.0_4120,點此下載
  • 軟件開發包: SDK_2.8.2_EVK-MIMXRT1010(Toolchain需包含MCUXpresso IDE),點此下載

2、查看工程Build信息

  用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)

3、添加c++源文件編譯報錯

  爲了測試方便,痞子衡直接寫了個簡單的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

4、讓MCUXpresso IDE正確編譯C++文件

4.1 激活C++編譯器

  在第二節裏咱們分析過Build信息,對於.c文件的編譯都是經過激活MCU C Compiler來實現的,如今.cpp文件被自動忽略了,估計是沒有使能C++編譯器,那咱們來開啓一下C++編譯器,在.project文件中增長一句代碼便可,具體以下:spa

  那句開啓C++編譯器的代碼是馬上生效的,不須要關掉重開IDE工程。如今讓咱們再次Build工程,此時編譯log裏已經有了sw_delay.cpp的身影,彷佛大功告成了。

4.2 爲C++連接器指明連接文件

  事情沒有那麼簡單,雖然.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文件確實被正常編譯連接了。

4.3 爲C++編譯器設置引用路徑和宏(可選)

  最後還須要提醒一下,若是cpp文件也依賴一些路徑和宏,須要把這些路徑和宏填到MCU C++ Compiler選項對應設置裏,默認路徑和宏定義都是空的。

  至此,MCUXpresso IDE下添加C++源文件進SDK工程編譯的方法痞子衡便介紹完畢了,掌聲在哪裏~~~

歡迎訂閱

文章會同時發佈到個人 博客園主頁CSDN主頁知乎主頁微信公衆號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就能夠在手機上第一時間看了哦。

相關文章
相關標籤/搜索