一、概述
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等等 儲存內...