大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异

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

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

  • Note: 痞子衡测试的MCUXpresso IDE版本是v11.4.0_6224。

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

  我们先来看看其它 IDE 下是如何生成和使用 Lib 库文件的。我们以 \SDK_2.10.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7 目录下的工程文件为例。这个 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 库,所以要对工程进行一些改动:

1. 将工程里除 fsl_lpuart.c 之外的其它 .c 文件全部移除,并且仅需保留 fsl_lpuart.c 所依赖的相关头文件。
2. 在工程选项 General Options / Output / Output file 里切换到 Library。
3. 在工程选项 Library Builder / Output / Output file 里命名生成的库文件(比如 lpuart_drv.a )。

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

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

二、MCUXpresso IDE下制作Lib库的方法

  了解了 IAR, MDK 下制作和使用 Lib 库方法,我们再来看本文的主角 MCUXpresso IDE 下制作 Lib 库的方法。首先是按照 《MCUXpresso IDE下SDK工程导入与workspace管理机制》 一文导入一个 hello_world 工程,在导入向导界面,我们能看到 SDK 里的例程类型是 C Project,旁边虽然有 C Static Library 选项,但是不可设置。

  我们先使用 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 选项勾选上。

  那么 MCUXpresso IDE 下如何生成静态 Lib 库呢?很遗憾,你必须在新建工程之初就确定工程类型为 C Static Library,工程类型确定之后无法仅通过工程选项来切换 C Project 和 C Static Library (这是和 IAR, MDK 不一样的第一个地方)。在创建 C Static Library 时尽量在导向里多余的源文件选项全部去掉,仅保留我们感兴趣的 lpuart 驱动。

  新建了 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 库文件。

  回到官方 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 特意设计)。此时再编译工程,就一切正常了。

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

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

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

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

  所以这其实就是链接方式的差异,链接(Link)是程序被装载到内存运行之前需要完成的一个步骤。链接本身分为静态链接(Static Link)和动态链接(Dynamic Link)两种方式。而在嵌入式 MCU 世界里,我们通常都是用静态链接这种方式。

  至此,MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

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

痞子衡嵌入式:MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异的更多相关文章

  1. 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...

  2. 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...

  3. 痞子衡嵌入式:MCUXpresso IDE下SDK工程导入与workspace管理机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程导入与workspace管理机制. MCUXpresso IDE是恩智浦软件团队倾注很大心血研发 ...

  4. 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...

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

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线调试时使用不同复位策略的现象总结. 本篇实际上是<IAR在线调试时设不同复位类型可能会导致i.M ...

  6. 痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异. 恩智浦 SW 团队每个季度都会公布 SDK.Tool ...

  7. 痞子衡嵌入式:MCUXpresso IDE下工程链接文件配置管理与自动生成机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下工程链接文件配置管理与自动生成机制. 痞子衡在 2018 年初写过一个专题 <嵌入式开发文件系列&g ...

  8. 痞子衡嵌入式:MCUXpresso IDE下将应用程序RW段分散链接的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法. 早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 ...

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

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...

随机推荐

  1. Blazor和Vue对比学习(基础1.2):模板语法和Razor语法

    Vue使用模板语法,Blazor使用祖传的Razor语法,从逻辑和方向上看,两者极为相似,比如: 都基于HTML 都通过声明式地将组件实例的状态(数据/方法)绑定到呈现的DOM上 都通过指令实现更加丰 ...

  2. 2021 CSP-J复赛 我的备战与游记

    目录 备战 2021.10.18 2021.10.19 2021.10.20 2021.10.21 2021.10.22 比赛当日 早上 线下见面 正文 比赛后 赛后总结与讲解 简单总结 Candy ...

  3. acunetix_14.7安装破解

    acunetix_14.7.220401065版 本次更新增加了许多的漏洞检测,包括Spring4Shell漏洞(CVE-2022-22965) 下载地址: https://pan.baidu.com ...

  4. 2022年5月11日,NBMiner发布了41.3版本,在内核中加入了100%LHR解锁器,从此NVIDIA的显卡再无锁卡一说

           2022年5月11日,NBMiner发布NBMiner_41.3版本,主要提升了稳定性.         2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核 ...

  5. 三、单redis升级redis集群+哨兵

    针对假如已经是安装了redis,只是是单部署,需要把他切换成redis集群+哨兵模式,我因为偷懒,就写了个脚本来执行,各位看官,请品~你品~你细品~ 首先准备个升级包,放到任意路径,内容如下: 第一个 ...

  6. CentOS删除编译安装的Python3

    编译安装Python3 # 下载 # wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz wget http://mirr ...

  7. 数仓选型必列入考虑的OLAP列式数据库ClickHouse(中)

    实战 案例使用 背景 ELK作为老一代日志分析技术栈非常成熟,可以说是最为流行的大数据日志和搜索解决方案:主要设计组件及架构如下: 而新一代日志监控选型如ClickHouse.StarRocks特别是 ...

  8. 检查MySQL主从复制运行状态

    脚本思路: 1.使用MySQL客户端命令"mysql"直接在命令行中运行MySQL指令"show slave status\G;"来查看MySQL主从复制状态信 ...

  9. java-去除html中的标签或者元素属性(正则表达式/jsoup)

    业务场景: 如一篇使用富文本编辑器编辑的新闻稿,需要在列表页面截取前200字作为摘要,此时需要去除html标签,截取真正的文本部分. /** * 删除Html标签 */public static St ...

  10. 功耗优化之Sensor功耗分析

    功耗优化之Sensor功耗分析 一.Sensor功耗问题分类 二.Sensor功耗问题分析方法 SSC子系统引起系统无法进入AOSD问题分析: SSC子系统频繁唤醒AP问题分析方法 SSC子系统的GP ...