一、為什麼要製作庫檔案?
(1)現有的庫:通過前人寫好的完善的庫,可以復用的**,你可以使用但要記得遵守許可協議。
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的**都從零開始,因此庫的存在意義非同尋常。共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項。
(2)自己寫的庫:在做乙個專案時,會涉及到多個功能模組,將每個模組通過庫的形式進行封裝,方便管理與模組化設計。
靜態庫與動態庫的區別?
靜態庫在程式編譯時會被連線到目標**中,目標程式執行時將不再需要該動態庫,移植方便,體積較大,但是浪費空間和資源,因為所有相關的物件檔案與牽涉到的庫被鏈結合成乙個可執行檔案。
動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行時才被載入,因此體積較小,可以實現程序間的資源共享,甚至可以真正做到鏈結載入完全由程式設計師在程式**中控制,另外將一些程式的公升級變得簡單,但是在程式執行時需要動態庫存在。
二、庫檔案的命名規範
在linux下,庫檔案一般放在/usr/lib /lib下,靜態庫的名字一般為lib***x.a,其中***x是該lib的名稱,動態庫的名字一般為lib***x.so.major.minor,***x是該lib的名稱,major是主版本號, minor是副版本號
三、如何製作靜態庫、動態庫?
假設我們製作乙個計算器的計算庫:
**如下counter.c:
#include
/*加法*/
float add(float a,float b)
/*減法*/
float sub(float a,float b)
/*乘法*/
float multip(float a,float b)
/*除法*/
float divide(float a,float b)
靜態庫製作步驟:step 1:gcc -c counter.c -o couter.o
step 2:ar cqs libcounter.a couter.o
step 3:cp libcounter.a /usr/lib/
動態庫製作步驟:
step 1:gcc -c counter.c -o couter.o
step 2:gcc -share -fpic counter. o -o libcouter.so
step 3:cp libcounter.so /usr/lib
注:-fpic:使輸出的物件模組是按照可重定位位址方式生成
-shared:指明產生動鏈結態庫
如何使用靜態庫、動態庫?
1.編寫庫函式標頭檔案:counter.h
#ifdnf _counter_h
#define _counter_h
float add(float a,float b);
float sub(float a,float b);
float multip(float a,float b);
float divide(float a,float b);
#endif
寫呼叫函式:test.c
#include
#include "counter.h"
int main(void)
靜態庫使用:
#gcc test.c -lcounter -o test
#/test
動態庫使用:
#gcc test.c -lcounter -o test
#./test
readelf -d test 檢視使用的庫情況
Linux gcc 製作動 靜態鏈結庫
以 math.c為例 gcc c math.c ar rcs libmath.a math.oar命令 將多個檔案打包成乙個備份檔案 引數r 用來替換庫中已有的目標檔案,或加入新的目標檔案 引數c 表示建立乙個庫,不管庫是否存在,都將建立 引數s 用來建立目標檔案的索引,這在建立較大的庫時能夠提高速...
Linux C 中動靜態庫的區別與製作
如果把庫比作是放在圖書館中的一本本書那麼 動態庫 只借閱,不賣出 靜態庫 直接賣出 動態庫在原始檔編譯的時候並不會將 資料拷貝進去,只會在程式執行的時候,鏈結完成一部分功能,當動態庫從指定路徑移除,程式無法正常執行,但好處在於使用動態庫的程式體積較小。靜態庫在原始檔編譯的時候直接將 資料拷進一起編譯...
Linux 下編譯鏈結動靜態庫
linux 版本是 red hat 9 核心版本是 2.4.18 輸入 which gcc 檢視 gcc 的位置在 usr bin gcc gcc v 檢視 gcc 編譯前的配置資訊 prefix usr 說明了安裝目錄 沒有 with headers 說明預設的 include 就在安裝目錄下 所...