中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

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

        引言

        前段時間因公司內(nèi)部業(yè)務(wù)調(diào)整,需要將自己的手頭上的有關(guān)的相關(guān)項目移交出去,為了保護核心代碼,應(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é)尾的文件,這并是我們今天的目標——靜態(tài)庫,往往第三方組件就是以.a和.h的方式提供給我們使用。 好了,話不多說,進入我們的主題~

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

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

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

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

        1)提供靜態(tài)庫的原材料,即.c和.h,這里我以簡單的實現(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)境的時候就已熟悉(如果不清楚的小伙伴請參考我的開發(fā)環(huán)境搭建相關(guān)視頻)。這里我編寫了一個簡單的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放在一個目錄中,如下:

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

        make make_lib=simplecal

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

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


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

        重點:在third_components頂層目錄中創(chuàng)建了一個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)容,說明我們編譯通過,接著就可以下載到板子上看程序跑起來驗證結(jié)果是否正確(因板子沒帶回來,放公司了,故這里就不給大家演示了,結(jié)果是正確的,大家可以自己驗證下)

        測試主函數(shù)

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

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

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

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

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

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


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

        COMPONENT_ADD_INCLUDEDIRS += . 
        COMPONENT_SRCDIRS += .

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

        EXTRA_COMPONENT_DIRS := ./simplecal


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


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


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

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

        COMPONENT_ADD_INCLUDEDIRS := .
        COMPONENT_SRCDIRS := .

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

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

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

        總結(jié)

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



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

        評論


        相關(guān)推薦

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

        關(guān)閉