esp8266/esp32基于RTOS_SDK(idf框架)制作自己的靜態(tài)庫
引言
前段時(shí)間因公司內部業(yè)務(wù)調整,需要將自己的手頭上的有關(guān)esp8266和esp32的相關(guān)項目移交出去,為了保護核心代碼,應領(lǐng)導要求需將一些核心的代碼打包成靜態(tài)庫(有關(guān)靜態(tài)庫和動(dòng)態(tài)庫的概念,我在之前的文章中都有介紹,以及如何在linux和windows中如何制作)。那么今天我們就來(lái)介紹下如何基于ESP8266_RTOS_SDK(idf框架,這里以esp8266為例,esp32完全同樣的原理)制作我們自己的靜態(tài)庫,既能提供他人使用,又能隱藏自己的源代碼。相信大家在日常開(kāi)發(fā)中,常常會(huì )見(jiàn)到以.a結尾的文件,這并是我們今天的目標——靜態(tài)庫,往往第三方組件就是以.a和.h的方式提供給我們使用。 好了,話(huà)不多說(shuō),進(jìn)入我們的主題~
本文引用地址:http://dyxdggzs.com/article/202503/468702.htm第一種:自己手工打包制作
首先需要說(shuō)明的是,文章中我會(huì )介紹2種方式制作我們的靜態(tài)庫,第一種是自己手動(dòng)使用工具鏈中的ar工具來(lái)制作;第二種是利用esp8266(或esp32)工程編譯完成自動(dòng)生成靜態(tài)庫的方式。
OK,先來(lái)介紹下第一種方式~
1)提供靜態(tài)庫的原材料,即.c和.h,這里我以簡(jiǎn)單的實(shí)現加,減,乘為例,具體如下:
//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/******************************分割線(xiàn)****************************************///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)接著(zhù)我們使用工具鏈中的ar工具來(lái)打包,需要說(shuō)明的是如果esp8266環(huán)境則使用的是xtensa-lx106-elf工具鏈,如果是esp32則使用的是xtensa-esp32-elf工具鏈,相信大家在搭建開(kāi)發(fā)環(huán)境的時(shí)候就已熟悉(如果不清楚的小伙伴請參考我的開(kāi)發(fā)環(huán)境搭建相關(guān)視頻)。這里我編寫(xiě)了一個(gè)簡(jiǎn)單的makefile來(lái)管理制作過(guò)程,具體內容如下:
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è)目錄中,如下:
然后打開(kāi)msys32(這里我以windows環(huán)境為例,linux環(huán)境也是同樣操作), 并cd到該目錄中,然后命令行輸入:
make make_lib=simplecal
在上圖紅框標注的libsimplecal.a就是我們的制作的靜態(tài)庫。
3)接著(zhù)我們我們把libsimplecal.a 和 simple.h加入到工程中測試。我們創(chuàng )建一個(gè)third_components的文件夾,具體目錄層級如下圖(需要說(shuō)明的是大家不用和我一樣創(chuàng )建各個(gè)目錄存放相應的文件,這里我是強迫癥,按正規實(shí)際項目規范來(lái),根據不同的文件存放相應的目錄中):
最后在include文件夾中存放了simple.h , 在lib文件夾中存放了libsimlecal.a。
重點(diǎn):在third_components頂層目錄中創(chuàng )建了一個(gè)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))
說(shuō)明:
COMPONENT_ADD_INCLUDEDIRS += myapp/include //為工程添加自己的頭文件路徑
COMPONENT_SRCDIRS += myapp //為工程添加自己的源文件路徑(這里我們沒(méi)有源文件,因此無(wú)關(guān)緊要,可寫(xiě)可不寫(xiě))
LIBS += simplecal
COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/myapp/lib $(addprefix -l,$(LIBS)) //為工程添加鏈接屬性,即指定我們的靜態(tài)庫名, 和靜態(tài)庫的路徑
4)最后我們嘗試編譯, 命令行輸入make
出現以上內容,說(shuō)明我們編譯通過(guò),接著(zhù)就可以下載到板子上看程序跑起來(lái)驗證結果是否正確(因板子沒(méi)帶回來(lái),放公司了,故這里就不給大家演示了,結果是正確的,大家可以自己驗證下)
測試主函數
重點(diǎn)?。?! 使用上述的方法制作靜態(tài)庫是完全正確的, 但是在實(shí)際應用過(guò)程,我發(fā)現制作的靜態(tài)庫會(huì )鏈接到esp8266內部的irom中,因為irom本身空間較小,當我們的源代碼再增多點(diǎn),就會(huì )出現重定位超過(guò)范圍,報錯:“dangerous relocation :.....out of range”
期間我粗略分析了下esp8266工程框架的makefile 以及一些相關(guān)鏈接腳本,
但是未能找到相關(guān)的鏈接的處理方式, 使其鏈接到外部的flash中, 之后我也咨詢(xún)了樂(lè )鑫的技術(shù)支持,也未能得到很好的解釋。于是乎我暫時(shí)先把這問(wèn)題擱置一下(因為最近個(gè)人事比較多 - -!),回頭抽時(shí)間再完整分析下樂(lè )鑫的整體框架Makefile和鏈接腳本,看看能否找到解決的方法。
接下來(lái)介紹第二種方式,這個(gè)親測有效,而且更適合大眾,不需要考慮復雜的Makefile和鏈接腳本和gcc工具鏈等等因素,直接上手就能用。OK,開(kāi)始行動(dòng)~
第二種:利用現有的工程
首先還是在工程目錄中創(chuàng )建一個(gè)文件夾如simplecal(名稱(chēng)隨意,但是如果不是叫components,則需要在工程主Makefile中添加EXTRA_COMPONENT_DIRS,來(lái)指定自己的額外增加的組件),并把源文件simple.c 和simple.h放到simple目錄中:
同時(shí)創(chuàng )建了一個(gè)component.mk文件,其內容:
COMPONENT_ADD_INCLUDEDIRS += .
COMPONENT_SRCDIRS += .
再次提醒,在工程主Makefile中添加以下內容:
EXTRA_COMPONENT_DIRS := ./simplecal
好了,接著(zhù)我們直接make編譯,編譯完成后,會(huì )在工程路徑中自動(dòng)生成了build文件夾, 我們進(jìn)入找到simplecal文件夾:
然后我們進(jìn)去simplecal中, 可以看到自動(dòng)為我們生成了libsimplecal.a靜態(tài)鏈接庫
接著(zhù)我們還是按照上面的方式測試下是否可用,將工程目錄中的simplecal文件中的simple_cal.c源文件刪除,然后把靜態(tài)庫libsimplecal.a拷貝進(jìn)來(lái):
同時(shí)我們需要修改下component.mk文件,內容如下:
COMPONENT_ADD_INCLUDEDIRS := .
COMPONENT_SRCDIRS := .
COMPONENT_ADD_LDFLAGS += -L . $(COMPONENT_PATH)/libsimplecal.a
接著(zhù)我們我們刪除build整個(gè)文件夾,再次make,全編譯:
可以看到是編譯成功,接著(zhù)就是下載到開(kāi)發(fā)板中實(shí)際驗證咯~
總結
以上2種方式都能制作esp8266/esp32平臺的靜態(tài)庫,當我們制作完成并應用工程中,這里有個(gè)關(guān)鍵的地方,即為工程添加鏈接參數COMPONENT_ADD_LDFLAGS,格式的話(huà)請參考上面。在第一種方式可能在鏈接重定位時(shí)有點(diǎn)問(wèn)題,大家可以親測下。
評論