自己動手寫linux靜態庫檔案

2021-06-07 23:59:37 字數 1418 閱讀 9940

一、概述

1、庫檔案分為動態庫和靜態庫,在linux下動態庫以.so結尾,靜態庫以.a結尾,但二者都是以lib開頭。

2、動態庫與靜態庫的區別在於:如果程式是在編譯時載入庫檔案的,就是使用了靜態庫。如果是在執行時載入目標**,就成為動態庫。換句話說,如果是使用靜態庫,則靜態庫**在編譯時就拷貝到了程式的**段,程式的體積會膨脹。如果使用動態庫,則程式中只保留庫檔案的名字和函式名,在執行時去查詢庫檔案和函式體,程式的體積基本變化不大。

二、靜態庫的編寫

靜態庫的編寫有兩種型別:

型別一:不帶頭檔案的庫

a.具體步驟:

a.編寫函式**

b.將a中所編寫的函式編譯生成目標檔案,即.o檔案。gcc編譯命令為:gcc -c filename

c.利用ar命令對b所得的目標檔案歸檔,生成靜態庫檔案。注意:庫檔案的名字必須以lib開頭,以.a結尾

b.示例程式檔案

#include

void mylibfun()

#include

int main()

c.靜態庫的生成與使用

1.生成目標檔案

gcc -c mylib.c

得到乙個mylib.o檔案

2.用ar命令歸檔,格式為ar -rc 《生成的檔案檔名》 <.o檔名列表》

ar -rc libtest.a mylib.o

執行完後會生成乙個libtest.a檔案

3.靜態庫檔案的呼叫

編譯目標檔案,注意將靜態庫的搜尋路徑加到-l引數裡面,把庫檔名(去掉打頭的lib和結尾的.a)加到-l引數後面。

gcc test.c -o test -l /home/origin -ltest 

此時就會生成乙個名為test的可執行檔案。

執行./test,輸出:

my static lib called

成功了!

三.帶頭檔案的靜態庫

基本上與上面的一樣,但是會有一些區別(紅色標註部分)

void test();

#inlcude

void mylibfun()

#include

int main()

靜態庫的生成與使用:

gcc -c mylib.c

ar -rc libtest.a mylib.o

gcc test.c -o test

-l /home/origin

-l /home/origin -ltest  

//靜態庫標頭檔案的路徑加到-i引數裡面

./test

輸出:my static lib called

自己動手寫flv檔案 1

專案需要使用ffmpeg來實現flv格式的編譯碼功能。ffmpeg對編譯碼大致分兩部分來實現 資料編碼和檔案編碼,直接呼叫相關api就可以實現。然而不夠靈活,需要自己定製flv格式,於是就把檔案編碼這一部分自己來做,加入自己的東西。資料的編碼直接使用ffmpeg的api。解碼的時候根據由自己來分析格...

自己動手寫bootloader

原始出處 作者資訊和本宣告。否則將追究法律責任。為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小 也就是說當啟動完核心之後,它的使命就已經結束。bootloader生命週期 初始化硬體 設定啟動...

自己動手寫CMS

簡易的cms外掛程式,可供借鑑或者擴充套件 流程 定義內容 分類與組織內容 儲存內容 操作控制內容 定義內容 制定目標 確定需要的內容型別 目標使用者定位 確定目標使用者需要何種技術 分類與組織內容 按內容所屬的邏輯層級關係來劃分 按內容的種類來劃分,比如video text audio等等 儲存內...