痞子衡嵌入式: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文件了,特此将经验分享给大家。
一、准备实验环境
首先需要准备好测试环境,包含必要的软件,痞子衡的环境如下:
二、查看工程Build信息
用MCUXpresso IDE打开经典的 \SDK_2.8.2_EVK-MIMXRT1010\boards\evkmimxrt1010\demo_apps\hello_world 例程,尝试Build一次,可以在Console窗口看到全部的Build信息:
其实扫一眼Console窗口里的信息对于理解MCUXpresso IDE工程流程很有帮助,其实总结下来就是如下三步分离的命令,只不过IDE自动按序执行了这些分离的命令:
**** 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()的调用代码。
////////////////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文件被自动忽略了。
四、让MCUXpresso IDE正确编译C++文件
4.1 激活C++编译器
在第二节里我们分析过Build信息,对于.c文件的编译都是通过激活MCU C Compiler来实现的,现在.cpp文件被自动忽略了,估计是没有使能C++编译器,那我们来开启一下C++编译器,在.project文件中增加一句代码即可,具体如下:
那句开启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主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法的更多相关文章
- 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...
- 痞子衡嵌入式:大话双核i.MXRT1170之单独在线调试从核工程的方法(IAR篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下单独在线调试从核工程的方法(基于IAR). 两年前痞子衡写过一篇<双核i.MXRT1170之Cortex-M ...
- 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...
- 痞子衡嵌入式:MCUXpresso IDE下将应用程序RW段分散链接的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法. 早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 ...
- 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...
- 痞子衡嵌入式:MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异. 程序函数库是一个包含已经编译好代码和数据的函数集合,这 ...
- 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ...
- 痞子衡嵌入式:MCUXpresso IDE下SDK工程导入与workspace管理机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程导入与workspace管理机制. MCUXpresso IDE是恩智浦软件团队倾注很大心血研发 ...
- 痞子衡嵌入式:MCUXpresso IDE下在线调试时使用不同复位策略的现象总结
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线调试时使用不同复位策略的现象总结. 本篇实际上是<IAR在线调试时设不同复位类型可能会导致i.M ...
随机推荐
- 设计模式:建造者模式及在jdk中的体现,建造者模式和工厂模式区别
0.背景 建造模式(Builder模式) 假如有一个需求:盖房子,盖房子过程是一致的:打桩.砌墙.封顶.但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅. 根据直接的思路,不用设计模式思想,我们 ...
- 记写 android 微信登录的demo历程
前言 首先看一条链接: https://github.com/Tencent/WeDemo 腾讯给了一个wedemo,微信第三方登录的例子.里面是php和ios,ios是object写的,php还是原 ...
- 9.hbase相关进程作用
1.协调服务组件Zookeeper Zookeeper的作用如下: 1. 保证任何时候,集群中只有一个HMaster: 2. 存储所有的HRegion的寻址入口: 3. 实时监控HRegionServ ...
- 【Go】单链表
node.go // 链表节点 type Node struct { data interface{} next *Node } // 构造一个节点 func NewNode(data interfa ...
- layui上传同一张图片第二次时choose没有反应
将上传文件的input的val设置为空 $("#test11").parent().find("input").val('');
- .NET 数据库事务的各种玩法进化
事务是数据库系统中的重要概念,本文讲解作者从业 CRUD 十余载的事务多种使用方式总结. 以下所有内容都是针对单机事务而言,不涉及分布式事务相关的东西! 关于事务原理的讲解不针对具体的某个数据库实现, ...
- .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用
环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...
- 赫然:Windows Live Writer 批量博客更新软件使用教程
http://www.wocaoseo.com/thread-144-1-1.html 推广人员需要使用多个博客,一个一个登陆更新是很麻烦的事情,网上的桌面批量更新博客软件也不少,今天在此推荐大家使用 ...
- 【HttpRunner v3.x】笔记 ——1. 环境安装
一.环境说明 HttpRunner 是一个基于 Python 开发的测试框架,可以运行在 macOS.Linux.Windows 系统平台上.笔者使用的是windows系统,所以后续都是基于windo ...
- 面试【JAVA基础】其他
1.自定义注解 @target 说明了Annotation所修饰的对象范围: constructor.method.field.package.type等等. @retention 定义了该Annot ...