请选择 进入手机版 | 继续访问电脑版
查看: 1593|回复: 1

MCUXpresso IDE下能否添加C++源文件进SDK工程编译?

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
    发表于 2020-9-18 10:02:55 | 显示全部楼层 |阅读模式
    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,点此下载
    软件开发包:SDK_2.8.2_EVK-MIMXRT1010(Toolchain需包含MCUXpresso IDE),点此下载
    二、查看工程Build信息
    用MCUXpresso IDE打开经典的 \SDK_2.8.2_EVK-MIMXRT1010\boards\evkmimxrt1010\demo_apps\hello_world 例程,尝试Build一次,可以在Console窗口看到全部的Build信息:
    1.png
    其实扫一眼Console窗口里的信息对于理解MCUXpresso IDE工程流程很有帮助,其实总结下来就是如下三步分离的命令,只不过IDE自动按序执行了这些分离的命令:
    1. **** Build of configuration Debug for project evkmimxrt1010_hello_world ****
    2. make -r -j4 all

    3. // 步骤一:激活C编译器按序编译工程内所有源文件(.c)生成对应重定向文件(.o)
    4. Invoking: MCU C Compiler
    5. arm-none-eabi-gcc -std=gnu99 -D__REDLIB__ // 略去一些工程宏、文件路径
    6. Building file: ../source/hello_world.c
    7. ...
    8. Finished building: ../source/hello_world.c

    9. // 步骤二:激活链接器链接所有重定向文件(.o)生成可执行文件(.axf)
    10. Building target: evkmimxrt1010_hello_world.axf
    11. Invoking: MCU Linker
    12. arm-none-eabi-gcc -nostdlib -Xlinker // 略去一些参数 -T evkmimxrt1010_hello_world_Debug.ld -o "evkmimxrt1010_hello_world.axf"  // 略去所有.o文件
    13. Finished building target: evkmimxrt1010_hello_world.axf

    14. // 步骤三:执行post build将可执行文件(.axf)转成镜像文件(.bin)
    15. make --no-print-directory post-build
    16. Performing post-build steps
    17. arm-none-eabi-size "evkmimxrt1010_hello_world.axf"; # arm-none-eabi-objcopy -v -O binary "evkmimxrt1010_hello_world.axf" "evkmimxrt1010_hello_world.bin" ;

    18. 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()的调用代码。
    1. ////////////////sw_test.cpp////////////////
    2. #include "sw_delay.h"
    3. void sw_delay(uint32_t n)
    4. {
    5.     while (n != 0U)
    6.     {
    7.         n--;
    8.     }
    9. }

    10. ////////////////sw_test.h////////////////
    11. #include <stdint.h>
    12. #if defined(__cplusplus)
    13. extern "C" {
    14. #endif
    15. void sw_delay(uint32_t n);
    16. #if defined(__cplusplus)
    17. }
    18. #endif
    复制代码
    现在开始重新Build加了sw_delay.cpp文件的工程,得到如下错误,这个错误就是找不到sw_delay()函数定义,因为sw_delay()函数代码被放在.cpp文件中(如果是放在.c文件中,编译一切正常),翻看全部编译log,并没有找到关于sw_delay.cpp文件的编译信息,看起来就像是.cpp文件被自动忽略了。
    3.png
    四、让MCUXpresso IDE正确编译C++文件
    4.1 激活C++编译器
    在第二节里我们分析过Build信息,对于.c文件的编译都是通过激活MCU C Compiler来实现的,现在.cpp文件被自动忽略了,估计是没有使能C++编译器,那我们来开启一下C++编译器,在.project文件中增加一句代码即可,具体如下:
    4.png
    那句开启C++编译器的代码是立刻生效的,不需要关掉重开IDE工程。现在让我们再次Build工程,此时编译log里已经有了sw_delay.cpp的身影,似乎大功告成了。
    5.png
    4.2 为C++链接器指明链接文件
    事情没有那么简单,虽然.cpp文件能够编译了,但工程最终Build发生了更多错误,log里信息上来看是链接阶段找不到代码里调用的一些c标准库函数以及链接文件里定义的一些段名和stack名等,看起来是链接文件有问题。
    6.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,便可以设好链接文件。
    7.png
    Apply属性设置之后,再次重编工程,终于看到0 errors, 0 warnings了,为了确保万一,可以在map文件里查看是否有sw_delay()函数,存在即说明.cpp文件确实被正常编译链接了。
    8.png
    4.3 为C++编译器设置引用路径和宏(可选)
    最后还需要提醒一下,如果cpp文件也依赖一些路径和宏,需要把这些路径和宏填到MCU C++ Compiler选项对应设置里,默认路径和宏定义都是空的。

    9.png
    至此,MCUXpresso IDE下添加C++源文件进SDK工程编译的方法痞子衡便介绍完毕了,掌声在哪里~~~


    文章出处:痞子衡嵌入式

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-8 09:06
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    18

    主题

    438

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    2209
    最后登录
    2024-3-5
    发表于 2020-9-19 14:17:00 | 显示全部楼层
    掌声,啪啪啪
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 16:43 , Processed in 0.126008 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表