痞子衡嵌入式: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主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就能够在手机上第一时间看了哦。