動態庫和靜態庫的區別

2021-10-09 20:08:21 字數 2659 閱讀 3758

靜態庫:

在程式編譯時會被鏈結到**中,程式執行時將不再需要靜態庫。

字尾是lib

靜態庫的生成:

生成靜態庫的時候要使用.o檔案來進行編譯生成

gcc

-cprint.c

-oprint.o

ar-rc

libtest.a

print.o

gccmain.c

-l.-ltest

-omain

動態庫:

在程式編譯並不會鏈結到**中,而是在程式執行時被載入,動態庫又被稱為動態鏈結庫,英文簡稱dll,dll是包含可以由多個程式使用的**和資料的庫,dll是不可執行檔案。

字首

lib
字尾

.

so

如何檢視乙個可執行檔案所依賴的庫?

ldd

+可執行程式

在linux作業系統下 靜態庫 linux字尾為.a檔案

動態庫 linux為.so檔案

libhello

.so

使用這個動態庫,我們直接在makefile檔案中-hello就行.

ld_library_path是linux環境變數名,該環境變數主要用於指定查詢共享庫(動態鏈結庫)時除了預設路徑之外的其他路徑。並不是在編譯階段就起效果

ldd命令:

ldd是list, dynamic, dependencies的縮寫, 意思是, 列出動態庫依賴關係。

動態庫生成:

gcc/g

++-shared

:產生共享庫的命令列引數

-fpic:產生位置無關的**

我們來製作個動態庫

先寫個test.c

#include

intprint()

gcc

-shared

-fpic

test.c

-olibtest

.so

我們寫個測試的** main.c

#include

intmain()

此時檔案資訊

如何讓主函式使用這個libtest.so

gcc

main.c

-l.-ltest

-l指定鏈結的庫檔案路徑

-l鏈結的庫檔案路徑

(去掉了前字尾)

這樣就能找到這個動態庫進行鏈結

**問題:**不論將程式依賴的動態庫放到**程式都能找到自己依賴的動態庫

1:將動態庫放到可執行程式的目錄下

可執行程式會搜尋當前目錄

2:環境變數

ld_library_path

:儲存動態庫的搜尋路徑

我們來看這個路徑下有什麼

總結:echo: 顯示某個環境變數值

export: 設定乙個新的環境變數

env: 顯示所有環境變數

unset: 清除環境變數

set: 顯示本地定義的shell變數和環境變數

每個程式都會收到一張環境表,環境表是乙個字元指標陣列,每個指標指向乙個以』\0』結尾的環境字串

解耦:互相的影響不是很大

動態庫不止能動態鏈結,也可以在編譯程式的時候靜態鏈結,同理,靜態庫不僅僅能靜態鏈結,也可以在編譯程式的時候動態鏈結,生成乙個動態鏈結的可執行程式。

動態庫優點:

模組體積幾乎不變,當多個模組使用該庫時,記憶體中只存在乙份**。

缺點:**在單獨檔案中有零散檔案

靜態庫優點:

**合併到模組中,無零散檔案。

靜態庫缺點:

模組體積變大,多個模組使用庫,記憶體中存在多份**。

動態庫和靜態庫的區別

一 什麼是庫?庫是共享程式 的方式,一般分為靜態庫和動態庫。靜態庫 鏈結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝。動態庫 鏈結時不複製,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只載入一次,多個程式共用,節省記憶體。二 靜態庫和動態庫的好處 使用靜態庫的好處 至於蘋果為啥禁止i...

linux動態庫和靜態庫的區別

兩者區別 a,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 2 設定lib檔案允許編譯器去查詢已經編譯好的二進位制 b,動態庫的使用 程式執行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫 c,依賴性 靜態鏈結表示靜態性,在編譯鏈結之後,lib庫中需要的資源...

動態庫和靜態庫

本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...