Linux 製作動 靜態庫 LS11

2021-08-10 15:26:58 字數 2060 閱讀 3884

一、為什麼要製作庫檔案?

(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 就在安裝目錄下 所...