• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > esp8266/esp32基于RTOS_SDK(idf框架)制作自己的靜態庫

    esp8266/esp32基于RTOS_SDK(idf框架)制作自己的靜態庫

    作者:嵌入式筆記v 時間:2025-03-27 來源:今日頭條 收藏

    引言

    前段時間因公司內部業務調整,需要將自己的手頭上的有關的相關項目移交出去,為了保護核心代碼,應領導要求需將一些核心的代碼打包成靜態庫(有關靜態庫和動態庫的概念,我在之前的文章中都有介紹,以及如何在linux和windows中如何制作)。那么今天我們就來介紹下如何基于ESP8266_RTOS_SDK(idf框架,這里以為例,完全同樣的原理)制作我們自己的靜態庫,既能提供他人使用,又能隱藏自己的源代碼。相信大家在日常開發中,常常會見到以.a結尾的文件,這并是我們今天的目標——靜態庫,往往第三方組件就是以.a和.h的方式提供給我們使用。 好了,話不多說,進入我們的主題~

    本文引用地址:http://www.czjhyjcfj.com/article/202503/468702.htm

    第一種:自己手工打包制作

    首先需要說明的是,文章中我會介紹2種方式制作我們的靜態庫,第一種是自己手動使用工具鏈中的ar工具來制作;第二種是利用(或)工程編譯完成自動生成靜態庫的方式。

    OK,先來介紹下第一種方式~

    1)提供靜態庫的原材料,即.c和.h,這里我以簡單的實現加,減,乘為例,具體如下:

    //simplecal.h 內容#ifndef _SIMPLE_CAL_H__#define _SIMPLE_CAL_H__int  myadd(int a, int b);int  mysub(int a, int b);int  mymul(int a, int b);#endif/******************************分割線****************************************///simplecal.c 內容#include "simple_cal.h"int myadd(int a, int b){	return (a+b);
    }int mysub(int a, int b){ return (a-b);
    }int mymul(int a, int b){ return (a*b);
    }

    2)接著我們使用工具鏈中的ar工具來打包,需要說明的是如果esp8266環境則使用的是xtensa-lx106-elf工具鏈,如果是esp32則使用的是xtensa-esp32-elf工具鏈,相信大家在搭建開發環境的時候就已熟悉(如果不清楚的小伙伴請參考我的開發環境搭建相關視頻)。這里我編寫了一個簡單的makefile來管理制作過程,具體內容如下:

    PRO_SRC := $(wildcard *.c)PRO_OBJ := $(patsubst %.c,%.o,$(PRO_SRC))CC := xtensa-lx106-elf-           #若是esp32,請改為 “xtensa-esp32-elf”${make_lib}.a:$(PRO_OBJ)
    @echo ${PRO_SRC}
    @echo ${PRO_OBJ} $(CC)ar -rc lib$(make_lib).a $^
    strip $(addprefix lib, $@) --strip-debug --strip-unneeded
    ${PRO_OBJ}:%.o:%.c
    $(CC)gcc -c lt; -I .             #-nostdlib -nostdinc .PHONY:cleanclean:
    rm -rf lib*.a *.o

    我們將以上makefile和原材料.c和.h放在一個目錄中,如下:

    然后打開msys32(這里我以windows環境為例,linux環境也是同樣操作), 并cd到該目錄中,然后命令行輸入:

    make make_lib=simplecal

    在上圖紅框標注的libsimplecal.a就是我們的制作的靜態庫。

    3)接著我們我們把libsimplecal.a 和 simple.h加入到工程中測試。我們創建一個third_components的文件夾,具體目錄層級如下圖(需要說明的是大家不用和我一樣創建各個目錄存放相應的文件,這里我是強迫癥,按正規實際項目規范來,根據不同的文件存放相應的目錄中):


    最后在include文件夾中存放了simple.h , 在lib文件夾中存放了libsimlecal.a。

    重點:在third_components頂層目錄中創建了一個componet.mk文件,內容如下:

    COMPONENT_ADD_INCLUDEDIRS := .
    COMPONENT_SRCDIRS := .

    COMPONENT_ADD_INCLUDEDIRS += . myapp/includeCOMPONENT_SRCDIRS += . myapp

    LIBS += simplecal

    COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/myapp/lib $(addprefix -l,$(LIBS))

    說明:

    COMPONENT_ADD_INCLUDEDIRS += myapp/include //為工程添加自己的頭文件路徑

    COMPONENT_SRCDIRS += myapp //為工程添加自己的源文件路徑(這里我們沒有源文件,因此無關緊要,可寫可不寫)

    LIBS += simplecal

    COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/myapp/lib $(addprefix -l,$(LIBS)) //為工程添加鏈接屬性,即指定我們的靜態庫名, 和靜態庫的路徑


    4)最后我們嘗試編譯, 命令行輸入make

    出現以上內容,說明我們編譯通過,接著就可以下載到板子上看程序跑起來驗證結果是否正確(因板子沒帶回來,放公司了,故這里就不給大家演示了,結果是正確的,大家可以自己驗證下)

    測試主函數

    重點!!! 使用上述的方法是完全正確的, 但是在實際應用過程,我發現制作的靜態庫會鏈接到esp8266內部的irom中,因為irom本身空間較小,當我們的源代碼再增多點,就會出現重定位超過范圍,報錯:“dangerous relocation :.....out of range”

    期間我粗略分析了下esp8266工程框架的makefile 以及一些相關鏈接腳本,

    但是未能找到相關的鏈接的處理方式, 使其鏈接到外部的flash中, 之后我也咨詢了樂鑫的技術支持,也未能得到很好的解釋。于是乎我暫時先把這問題擱置一下(因為最近個人事比較多 - -!),回頭抽時間再完整分析下樂鑫的整體框架Makefile和鏈接腳本,看看能否找到解決的方法。

    接下來介紹第二種方式,這個親測有效,而且更適合大眾,不需要考慮復雜的Makefile和鏈接腳本和gcc工具鏈等等因素,直接上手就能用。OK,開始行動~

    第二種:利用現有的工程

    首先還是在工程目錄中創建一個文件夾如simplecal(名稱隨意,但是如果不是叫components,則需要在工程主Makefile中添加EXTRA_COMPONENT_DIRS,來指定自己的額外增加的組件),并把源文件simple.c 和simple.h放到simple目錄中:


    同時創建了一個component.mk文件,其內容:

    COMPONENT_ADD_INCLUDEDIRS += . 
    COMPONENT_SRCDIRS += .

    再次提醒,在工程主Makefile中添加以下內容:

    EXTRA_COMPONENT_DIRS := ./simplecal


    好了,接著我們直接make編譯,編譯完成后,會在工程路徑中自動生成了build文件夾, 我們進入找到simplecal文件夾:


    然后我們進去simplecal中, 可以看到自動為我們生成了libsimplecal.a靜態鏈接庫


    接著我們還是按照上面的方式測試下是否可用,將工程目錄中的simplecal文件中的simple_cal.c源文件刪除,然后把靜態庫libsimplecal.a拷貝進來:

    同時我們需要修改下component.mk文件,內容如下:

    COMPONENT_ADD_INCLUDEDIRS := .
    COMPONENT_SRCDIRS := .

    COMPONENT_ADD_LDFLAGS += -L . $(COMPONENT_PATH)/libsimplecal.a

    接著我們我們刪除build整個文件夾,再次make,全編譯:

    可以看到是編譯成功,接著就是下載到開發板中實際驗證咯~

    總結

    以上2種方式都能制作esp8266/esp32平臺的靜態庫,當我們制作完成并應用工程中,這里有個關鍵的地方,即為工程添加鏈接參數COMPONENT_ADD_LDFLAGS,格式的話請參考上面。在第一種方式可能在鏈接重定位時有點問題,大家可以親測下。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 井陉县| 江永县| 万荣县| 河北省| 东源县| 谷城县| 丁青县| 鞍山市| 辉县市| 巴彦县| 绥滨县| 饶阳县| 紫金县| 巴林左旗| 余姚市| 龙口市| 屏东县| 龙口市| 辽阳县| 邳州市| 惠东县| 南阳市| 铜川市| 元氏县| 务川| 军事| 岫岩| 根河市| 全州县| 安丘市| 永寿县| 馆陶县| 安国市| 洪雅县| 吴堡县| 西青区| 治县。| 南江县| 双牌县| 丹东市| 扶风县|