Linux基礎 靜態庫和共享庫

2021-10-23 15:37:07 字數 2191 閱讀 9235

概念:庫檔案就是目標檔案的集合,可以被其它**呼叫,把**封裝成庫檔案後方便使用、方便管理、安全性高、保密性強。

靜態庫和共享庫輔助工具:

ldd 檢視可執行程式依賴那些共享庫

nm 檢視目標檔案、可執行檔案、靜態庫、共享庫中的符號列表

strip **,刪除目標檔案、可執行檔案、靜態庫、共享庫中的符號。

objdump 顯示目標檔案、可執行檔案、靜態庫、共享庫反彙編資訊。

靜態庫就是目標檔案的集合,呼叫靜態庫就是把靜態庫中的二進位制指令拷貝到可執行檔案中。

優點:執行速度比共享庫快。

缺點:可執行檔案相對較大,當靜態庫修改後,可執行檔案要重新編譯。

共享庫:就是沒入口的可以執行檔案,呼叫共享庫就是記錄共享中二進位制指標的位置即可。當執行可執行檔案時共享庫會被一起載入到記憶體,可執行檔案中可以跳轉到共享庫中執行。

優點:可執行檔案相對較小,當共享庫修改後,可執行檔案不要重新編譯。

缺點:執行速度比靜態庫慢,可執行檔案執行時也需要依賴共享庫。

製作靜態庫

1、編譯出目標檔案

gcc -c code.c

2、打包目標檔案生成靜態庫

ar -r libname.a a.o b.o c.o …

使用靜態庫

1、直接使用

gcc code.c libname.a

2、指定庫檔案的位置

-l指定庫的路徑 -l指定庫名

gcc code.c -lpath -lname

3、通過設定環境變數指定庫的路徑,-l指定庫名

開啟配置檔案:vi ~/.bashrc

在檔案的末尾新增:export library_path=$library_path:path

例如: # 靜態庫路徑

export library_path=$library_path:/home/php/lib

使用靜態庫:gcc code.c -lname

注意:刪除環境變數,需要關閉終端,再重新開啟。

製作共享庫:

1、編譯生成目標檔案

gcc -fpic -c code.c

fpic 位置無關

2、生成共享庫

gcc -shared -fpic a.o b.o c.o … -o libname.so

使用共享庫:

1、直接使用

gcc code.c libname.so

2、指定庫檔案的位置

-l指定庫的路徑 -l指定庫名

gcc code.c -lpath -lname

3、通過設定環境變數指定庫的路徑: library_path

例如: #分享庫路徑

注意:設定程式執行共享庫的載入路徑

開啟配置檔案:vi ~/.bashrc

在檔案的末尾新增:export ld_library_path=$ld_library_path:path

注意:當共享與靜態庫同時存在時,編譯器會優先使用共享庫,加乙個 -static編譯引數 優先使用靜態庫。

靜態庫和共享庫

建立和使用靜態庫 1 建立目錄 mkdir p test sub 2 在子目錄sub 下編寫hello.c和hello.h hello.c include include hello.h void hello hello.h include void hello 4 在主目錄test 下編寫main...

Linux中的靜態庫和共享庫

一 庫的概念 二 靜態庫 2.1 靜態庫的特點 程式中包含 執行時不再需要靜態庫 程式執行時無需載入庫,執行速度更快 占用更多磁碟和空間 靜態庫公升級後,程式需要重新編譯鏈結 2.2 靜態庫的建立及鏈結第一步 確定庫中函式的功能 介面 第二步 編寫庫原始碼 hello.c include inclu...

Linux 靜態庫與共享庫

可以把 多個編譯好的目標檔案 打包成為乙個檔案,就是庫檔案。庫檔案有兩種 靜態庫 a 和共享庫 so 靜態庫和共享庫區別 靜態庫是 函式的歸檔,在使用時,複製函式的 區到最終的檔案中。共享庫是 函式的歸檔,在使用時,把函式在共享庫中的位址拿到最終的檔案中。靜態庫的效率稍高一點,但占用空間非常大,而且...