大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是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. Docker系列教程04-Docker构建镜像的三种方式

    简介 创建镜像的方法主要有三种:基于已有镜像的容器创建.基于本地模板导入.基于Dockerfile创建. 今天就逐一讲述为大家讲述,如何构建属于自己的docker镜像. 1.基于容器构建镜像 基于已有 ...

  2. web安全之信息收集篇

    信息收集 1.网络信息 网络信息就包括网站的厂商.运营商,网站的外网出口.后台.OA. 2.域名信息 通过域名可以查洵网站的所有人.注册商.邮箱等信息 --->Whois 第三方查询,查询子域网 ...

  3. 那些年你啃过的ConcurrentHashMap

    前言 我是fancy,一个年纪轻轻bug量就累计到3200个的程序员,同事们都夸我一个人养活了整个测试组. 最近迷上了并发编程.并发这玩意怎么说呢,就是你平时工作用不到,一用就用在面试上.这不,又卷起 ...

  4. awk内建函数

    内建函数 length() 获得字符串长度 cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 25 ...

  5. JVM的类加载过程

    每日一句 人到情多情转薄,而今真个不多情. 每日一句 The frog in the well knows nothing of the great ocean. 井底之蛙,不知大海. JVM 的类加 ...

  6. Random 中的Seed

    C#中使用随机数 看下例 当Random的种子是0时 生成的随机数列表是一样的 也就是说当seed 一样时 审查的随机数时一样的 Random的无参实例默认 种子 时当前时间 如果要确保生成的随机数不 ...

  7. synchronized真的很重么?

    synchronized 是java中常见的保证多线程访问共享资源时的安全的一个关键字.很多人在讲到synchronized 时都说synchronized 是一把重量级的锁,那么synchroniz ...

  8. Flink整合面向用户的数据流SDKs/API(Flink关于弃用Dataset API的论述)

    动机 Flink提供了三种主要的sdk/API来编写程序:Table API/SQL.DataStream API和DataSet API.我们认为这个API太多了,建议弃用DataSet API,而 ...

  9. 这个Spring Security登录插件牛啊,验证码、小程序、OAuth2都能快速接入

    上次我们把验证码登录.小程序登录优雅地集成到了Spring Security,很多同学大呼过瘾,相比较一些传统玩法高级了很多.胖哥就赶紧抓住机会举一反三,把几个非标准的OAuth2也接入了进来,主要是 ...

  10. HDLBits->Circuits->Multiplexers->Mux256to1v

    Verilog切片语法 题目要求如下 Create a 4-bit wide, 256-to-1 multiplexer. The 256 4-bit inputs are all packed in ...