0

痞子衡嵌入式:MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异 - 痞子衡

 1 year ago
source link: https://www.cnblogs.com/henjay724/p/16515742.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是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主页知乎主页微信公众号 平台上。

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

  最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。

  衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。

  专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

  与痞子衡进一步交流或咨询业务合作请发邮件至 [email protected]

  可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

  关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

  痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK