<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    16130

    瀏覽量

    344836
  • 源碼
    +關注

    關注

    8

    文章

    586

    瀏覽量

    28683
  • mcuxpresso
    +關注

    關注

    1

    文章

    37

    瀏覽量

    4058
收藏 人收藏

    評論

    相關推薦

    芯海通用 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 MDK、MCUXpresso 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

    mcuxpresso ide中有rtp文件嗎?

    iam ip 攝像機與 mimxrt1170 處理器連接,所以我需要使用 rtp 協議,所以我通過了 sdk,但我沒有找到 rtp 頭文件,所以我們在 MCUXpresso IDE v11.6.0 [Build 8187]
    發表于 04-20 08:20

    如何為pn7362使用MCUXpresso IDE?

    網站上找到的。 NXP 網站上提供的手冊似乎沒有詳細信息。請下載 SW368332.zip 文件并說明如何在 MCUXpresso 中使用它。 另外,請檢查該項目是否可以轉換為 IAR 并使用。
    發表于 04-23 06:56

    痞子衡嵌入式:MCUXpresso IDE下在線調試時使用不同復位策略的現象總結

    i.MXRT下調試現象不一致》的同系列篇,計劃中痞子衡是要把幾大經典IDE(IAR EWARM、Keil MDK、MCUXpresso IDE
    發表于 11-30 18:06 ?14次下載
    痞子衡嵌入式:<b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>下在線調試時使用不同復位策略的現象總結

    不同復位類型設置對MCUXpresso IDE在線調試有何影響?

    大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下在線調試時使用不同復位策略的現象總結。本篇實際上是《IAR在線調試時設不同復位類型可能會導致i...
    發表于 12-04 12:21 ?8次下載
    不同復位類型設置對<b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>在線調試有何影響?

    痞子衡嵌入式:MCUXpresso IDE下將關鍵函數重定向到RAM中執行的幾種方法

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下將關鍵函數重定向到RAM中執行的幾種方法?! ∏岸螘r間痞子衡寫了一篇 《在IAR開發環
    發表于 12-06 19:36 ?9次下載
    痞子衡嵌入式:<b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>下將關鍵函數重定向到RAM中執行的幾種<b class='flag-5'>方法</b>

    三種常用IDE下花式生成鏡像文件的方法

    大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下生成鏡像文件的方法及其IAR,
    的頭像 發表于 10-24 14:08 ?1020次閱讀

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

    MCUXpresso IDE下生成鏡像文件的方法及其IAR,MDK
    的頭像 發表于 09-28 17:05 ?618次閱讀
    <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>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>