新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > esp8266/esp32基于RTOS_SDK(idf框架)制作自己的靜態(tài)庫

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

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

引言

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

本文引用地址:http://2s4d.com/article/202503/468702.htm

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

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

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

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

//simplecal.h 內(nèi)容#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 內(nèi)容#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環(huán)境則使用的是xtensa-lx106-elf工具鏈,如果是esp32則使用的是xtensa-esp32-elf工具鏈,相信大家在搭建開發(fā)環(huán)境的時(shí)候就已熟悉(如果不清楚的小伙伴請參考我的開發(fā)環(huán)境搭建相關(guān)視頻)。這里我編寫了一個(gè)簡單的makefile來管理制作過程,具體內(nèi)容如下:

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放在一個(gè)目錄中,如下:

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

make make_lib=simplecal

在上圖紅框標(biāo)注的libsimplecal.a就是我們的制作的靜態(tài)庫。

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


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

重點(diǎn):在third_components頂層目錄中創(chuàng)建了一個(gè)componet.mk文件,內(nèi)容如下:

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 //為工程添加自己的源文件路徑(這里我們沒有源文件,因此無關(guān)緊要,可寫可不寫)

LIBS += simplecal

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


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

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

測試主函數(shù)

重點(diǎn)?。?! 使用上述的方法是完全正確的, 但是在實(shí)際應(yīng)用過程,我發(fā)現(xiàn)制作的靜態(tài)庫會鏈接到esp8266內(nèi)部的irom中,因?yàn)閕rom本身空間較小,當(dāng)我們的源代碼再增多點(diǎn),就會出現(xiàn)重定位超過范圍,報(bào)錯(cuò):“dangerous relocation :.....out of range”

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

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

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

第二種:利用現(xiàn)有的工程

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


同時(shí)創(chuàng)建了一個(gè)component.mk文件,其內(nèi)容:

COMPONENT_ADD_INCLUDEDIRS += . 
COMPONENT_SRCDIRS += .

再次提醒,在工程主Makefile中添加以下內(nèi)容:

EXTRA_COMPONENT_DIRS := ./simplecal


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


然后我們進(jìn)去simplecal中, 可以看到自動為我們生成了libsimplecal.a靜態(tài)鏈接庫


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

同時(shí)我們需要修改下component.mk文件,內(nèi)容如下:

COMPONENT_ADD_INCLUDEDIRS := .
COMPONENT_SRCDIRS := .

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

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

可以看到是編譯成功,接著就是下載到開發(fā)板中實(shí)際驗(yàn)證咯~

總結(jié)

以上2種方式都能制作esp8266/esp32平臺的靜態(tài)庫,當(dāng)我們制作完成并應(yīng)用工程中,這里有個(gè)關(guān)鍵的地方,即為工程添加鏈接參數(shù)COMPONENT_ADD_LDFLAGS,格式的話請參考上面。在第一種方式可能在鏈接重定位時(shí)有點(diǎn)問題,大家可以親測下。



關(guān)鍵詞: esp32 esp8266 制作靜態(tài)庫

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉