0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异

jf_pJlTbmA9 来源:恩智浦MCU加油站  作者:恩智浦MCU加油站  2023-11-07 17:13 次阅读

程序函数库是一个包含已经编译好代码和数据的目标文件集合,这个库文件里的函数可以供其他程序调用。

被放进库文件里的代码通常具有一定通用性,是经过高度抽象的,这样可以避免重复造轮子。程序函数库设计可以使得程序的开发工作更加模块化,更容易重新编译,也更方便升级。

嵌入式开发里有时候也会需要涉及函数库文件,除了模块化开发以及方便升级特点外,有时候也是为了对源代码进行保密,毕竟库文件是编译后的文件。今天就跟大家聊聊 MCUXpresso IDE 下生成 Lib 库文件的方法及其与 IAR, MDK 有何差异。

注: 本文测试的MCUXpresso IDE版本是v11.4.0_6224。

一、其它IDE下制作Lib库的方法

我们先来看看其它 IDE 下是如何生成和使用 Lib 库文件的。我们以 SDK_2.10.0_MI
MXRT1170-EVKboardsevkmimxrt1170demo_appshello_worldcm7目录下的工程文件为例。

这个 hello_world 例程主要就是利用 LPUART 外设驱动( fsl_lpuart.c )实现串口打印功能,这里我们就尝试将 fsl_lpuart.c 文件制作成 Lib 库(这里特指静态链接库 - Static Library)。

1.1 IAR EWARM

使用IAR 打开 hello_world_demo_cm7.eww 文件,编译默认工程可以得到工程可执行文件和镜像文件,这是经过编译和链接之后的可直接执行的纯机器码数据。由于我们只需要将 fsl_lpuart.c 文件制作成 Lib 库,所以要对工程进行一些改动:

将工程里除fsl_lpuart.c 之外的其它.c 文件全部移除,并且仅需保留fsl_lpuart.c 所依赖的相关头文件。
在工程选项General Options / Output / Output file 里切换到 Library。

在工程选项Library Builder / Output / Output file 里命名生成的库文件(比如 lpuart_drv.a )。

这时候重新编译工程便可以得到我们想要的 lpuart_drv.a 库文件,如果要使用这个库文件的话,也非常简单,只要在原始的hello_world 工程里将 fsl_lpuart.c 文件替换成 lpuart_drv.a 即可。

wKgaomUD352APFiKAASsvto44VI909.png

1.2 Keil MDK下

MDK 下制作和使用 Lib库的方法与IAR差不多,就是工程设置差异。

使用 MDK 打开 hello_world_demo_cm7.uvprojx文件,同样对工程进行一些改动:

1)将工程里除fsl_lpuart.c 之外的其它.c 文件全部移除,并且仅需保留fsl_lpuart.c 所依赖的相关头文件。

2)在工程选项Output / 里切换到Create Library。

3)在工程选项Output / Name of Executable 里命名生成的库文件(比如 lpuart_drv.lib )。

wKgZomUD356AI59iAAQmi_1vGUM884.png

二、MCUXpresso IDE下制作Lib库

了解了IAR, MDK 下制作和使用 Lib 库方法,我们再来看本文的主角 MCUXpresso IDE 下制作 Lib 库的方法。

首先是按照 《MCUXpresso IDE下SDK工程导入与workspace管理机制》 一文导入一个 hello_world 工程,在导入向导界面,我们能看到 SDK 里的例程类型是C Project,旁边虽然有 C Static Library 选项,但是不可设置。

wKgaomUD36KAKq0lAAR2ZEz7Z-w307.png

我们先使用 SDK 包里导出的默认工程(C Project),按照之前 IAR, MDK 上的经验,在这个工程里做如下改动。重新编译工程,发现生成的文件似乎跟原始工程生成的可执行文件(Artifact Type 为 Executable )差不多,显然 Shared Library 并不是我们想要的静态 Lib 库。

1)将工程里除fsl_lpuart.c 之外的其它.c 文件全部移除,并且仅需保留fsl_lpuart.c 所依赖的相关头文件。

2)在工程选项C/C++ Build / Settings / Build Artifact / Artifact Type 里切换到Shared Library。

3)工程选项C/C++ Build / Settings / Tool Settings / MCU Linker / Shared Library Settings 里Shared 选项勾选上。

wKgaomUD36OAWWzoAAR56LyDC_Y670.png

那么MCUXpresso IDE 下如何生成静态 Lib 库呢?很遗憾,你必须在新建工程之初就确定工程类型为 C Static Library,工程类型确定之后无法仅通过工程选项来切换 C Project 和 C Static Library (这是和IAR, MDK 不一样的第一个地方)。

在创建 C Static Library 时尽量在向导里将多余的源文件选项全部去掉,仅保留我们感兴趣的 lpuart 驱动。

wKgZomUD36WAKzBhAAQHoxppUDg281.png

新建了C Static Library 工程后,发现工程里还是残留了多余的 .c 文件(Debug Console 和 device 初始化相关文件),这时候再手动移除这些 .c 文件,然后打开工程选项 C/C++ Build / Settings / Build Artifact / Artifact Type,此时仅有 Static Library 一种选择。

编译工程可得到 liblpuart_drv.a 文件(MCUXpresso IDE 特意在用户设置的库名加了 lib 前缀,这是刻意设计的,后面使用该库文件时会用到这个设计),即是我们需要的静态Lib 库文件。

wKgaomUD36aALejeAAPiOUToFs0631.png

回到官方SDK 包里原始的 hello world 例程里,此时我们尝试使用这个 liblpuart_drv.a 文件,我们将工程目录下的 fsl_lpuart.c 文件替换成 liblpuart_drv.a 文件,直接编译发现报错,无法找到 LPUART 相关驱动,显然工程并没有直接识别库文件(这是跟 IAR, MDK 不一样的第二个地方),这时候需要更新下工程选项,在 C/C++ Build / Settings / Tool Settings / MCU Linker / Libraries 里添加 liblpuart_drv.a 库(包括名字和路径),这里特别注意库名字仅需要填lpuart_drv,不需要 lib 前缀(这就是前面所说的MCUXpresso IDE 特意设计)。此时再编译工程,就一切正常了。

wKgZomUD36iANsaIAATAZkVANoU079.png

三、静态链接库和共享链接库差异

在MCUXpresso IDE 下我们接触到了两种库 Static Library 和 Shared Library,最后再简单介绍下它俩的差异。

静态库是一些 .o 目标文件的集合,一般以 .a/.lib 形式结尾。静态库在程序链接阶段使用,链接器将程序要用到的函数从库中提取出来,并整合到程序中,程序运行不再使用静态库了。由于每个程序要用到函数都从库提取并整合在一起,所以可执行文件会比较大。

共享库即动态链接库,在 Linux 中以 .so(share object) 为后缀,在 Windows 中以 .dll 为后缀。程序开始启动运行时,加载所需的函数,程序运行时也需要共享库的支持。共享库链接出来的文件比静态库要小得多。

所以这其实就是链接方式的差异,链接(Link)是程序被装载到内存运行之前需要完成的一个步骤。链接本身分为静态链接(Static Link)和动态链接(Dynamic Link)两种方式。

而在嵌入式 MCU 世界里,我们通常都是用静态链接这种方式。

来源:恩智浦MCU加油站


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17148

    浏览量

    351193
  • 源码
    +关注

    关注

    8

    文章

    641

    浏览量

    29208
  • mcuxpresso
    +关注

    关注

    1

    文章

    40

    浏览量

    4180
收藏 人收藏

    评论

    相关推荐

    芯海通用 MCU应用笔记 :在 IARMDK 开发环境使用 printf 函数重定向移植差异指南

    对 printf 函数支持的差异。并在本应用笔记结尾处给出可以一键移植到 Keil、IAR8.x、IAR9.x 版本的通用重定向代码。 Keil 和
    发表于 05-16 11:56

    mdk生成的lib如何用在IAR中?

    我现在有一个lib文件,之前一直用在MDK中,后来需要IAR编辑时也要用这个lib,因为我这边没有源码,直接把
    发表于 02-03 14:40

    BRD板和LIB之间LIBLIB之间的封装和焊盘差异

    程序功能:验证BRD板和LIB之间,SIP板和LIB之间,MCM板和LIB之间的封装和焊盘
    发表于 08-24 12:50

    如何使用MDK/MCUXpresso IDE/IAR工具编译生成烧录固件文件

    使用MDK/MCUXpresso IDE/IAR工具编译生成烧录固件文件。使用MCU BootUtility来加载hex文件或者bin文件或者是.srec文件进行一站式烧录。默认情况
    发表于 11-04 06:55

    MCUXpresso IDE下在线调试时使用不同复位策略的现象分享

    i.MXRT下调试现象不一致》的同系列篇,计划中痞子衡是要把几大经典IDE(IAR EWARM、Keil MDKMCUXpresso IDE
    发表于 01-25 07:37

    在keil和IAR环境lib的生成和使用

    lib静态的使用可以简化项目开发流程,提高开发效率,本文详细介绍了在keil和IAR环境lib
    发表于 01-27 06:52

    分享MCUXpresso IDE关键函数重定向到RAM中执行的几种方法

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE关键函数重定向到RAM中执行的几种方法
    发表于 02-10 06:44

    MCUXpresso IDE应用程序RW段分散链接有哪几种方法

    MCUXpresso IDE应用程序RW段分散链接有哪几种方法
    发表于 02-10 08:03

    如何为pn7362使用MCUXpresso IDE

    网站上找到的。 NXP 网站上提供的手册似乎没有详细信息。请下载 SW368332.zip 文件并说明如何在 MCUXpresso 中使用它。 另外,请检查该项目是否可以转换为 IAR 并使用。
    发表于 04-23 06:56

    痞子衡嵌入式:MCUXpresso IDE下在线调试时使用不同复位策略的现象总结

    i.MXRT下调试现象不一致》的同系列篇,计划中痞子衡是要把几大经典IDE(IAR EWARM、Keil MDKMCUXpresso IDE
    发表于 11-30 18:06 14次下载
    痞子衡嵌入式:<b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>下在线调试时使用不同复位策略的现象总结

    keil和IARlib文件的生成和使用

    lib静态的使用可以简化项目开发流程,提高开发效率,本文详细介绍了在keil和IAR环境lib
    发表于 12-03 11:51 15次下载
    keil和<b class='flag-5'>IAR</b>中<b class='flag-5'>lib</b><b class='flag-5'>库</b>文件的生成和使用

    痞子衡嵌入式:MCUXpresso IDE关键函数重定向到RAM中执行的几种方法

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE关键函数重定向到RAM中执行的几种方法
    发表于 12-06 19:36 9次下载
    痞子衡嵌入式:<b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b><b class='flag-5'>下</b><b class='flag-5'>将</b>关键函数重定向到RAM中执行的几种<b class='flag-5'>方法</b>

    三种常用IDE花式生成镜像文件的方法

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE下生成镜像文件的方法及其IAR,
    的头像 发表于 10-24 14:08 1495次阅读

    AN075 基于MDK实现的Lib调用方案介绍

    AN075 基于MDK实现的Lib调用方案介绍
    发表于 03-01 18:56 0次下载
    AN075 基于<b class='flag-5'>MDK</b>实现的<b class='flag-5'>Lib</b><b class='flag-5'>库</b>调用方案介绍

    MCUXpresso IDE下生成镜像文件的方法及其IAR,MDK差异

    MCUXpresso IDE下生成镜像文件的方法及其IAR,MDK
    的头像 发表于 09-28 17:05 862次阅读
    <b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>下生成镜像文件的<b class='flag-5'>方法</b><b class='flag-5'>及其</b>与<b class='flag-5'>IAR</b>,<b class='flag-5'>MDK</b><b class='flag-5'>差异</b>