linux動態庫和靜態庫的區別

2021-07-30 11:23:10 字數 1507 閱讀 1991

兩者區別:

a,靜態庫的使用需要:

1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容

2 設定lib檔案允許編譯器去查詢已經編譯好的二進位制**

b,動態庫的使用:

程式執行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫

c,依賴性:

靜態鏈結表示靜態性,在編譯鏈結之後, lib庫中需要的資源已經在可執行程式中了, 也就是靜態存在,沒有依賴性了

動態,就是實時性,在執行的時候載入需要的資源,那麼必須在執行的時候提供 需要的 動態庫,有依賴性, 執行時候沒有找到庫就不能執行了

d,區別:

簡單講,靜態庫就是直接將需要的**連線進可執行程式;動態庫就是在需要呼叫其中的函式時,根據函式對映表找到該函式然後調入堆疊執行。

做成靜態庫可執行檔案本身比較大,但不必附帶動態庫

做成動態庫可執行檔案本身比較小,但需要附帶動態庫

靜態庫是程式執行的時候已經調入記憶體,不管有沒有呼叫,都會在記憶體裡頭。靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫。

其在編譯程式時若鏈結,程式執行時會在系統指定的路徑下搜尋,然後匯入記憶體,程式一般執行時間稍微長一點,但編譯的可執行檔案比較小;動態庫是程式執行的時候需要呼叫的時候才裝入記憶體,不需要的時候是不會裝入記憶體的。

動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。

動態鏈結庫的特點與優勢

首先讓我們來看一下,把庫函式推遲到程式執行時期載入的好處:

1. 可以實現程序之間的資源共享。

什麼概念呢?就是說,某個程式的在執行中要呼叫某個動態鏈結庫函式的時候,作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷貝了。如果有,則讓其共享那乙個拷貝;只有沒有才鏈結載入。這樣的模式雖然會帶來一些「動態鏈結」額外的開銷,卻大大的節省了系統的記憶體資源。c的標準庫就是動態鏈結庫,也就是說系統中所有執行的程式共享著同乙個c標準庫的**段。

2. 將一些程式公升級變得簡單。使用者只需要公升級動態鏈結庫,而無需重新編譯鏈結其他原有的**就可以完成整個程式的公升級。windows 就是乙個很好的例子。

3. 甚至可以真正坐到鏈結載入完全由程式設計師在程式**中控制。

程式設計師在編寫程式的時候,可以明確的指明什麼時候或者什麼情況下,鏈結載入哪個動態鏈結庫函式。你可以有乙個相當大的軟體,但每次執行的時候,由於不同的操作需求,只有一小部分程式被載入記憶體。所有的函式本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能開啟若干種不同型別的檔案,這些讀寫操作通常都用動態鏈結庫來實現。在一次執行當中,一般只有一種型別的檔案將會被開啟。所以直到程式知道檔案的型別以後再載入相應的讀寫函式,而不是一開始就將所有的讀寫函式都載入,然後才發覺在整個程式中根本沒有用到它們。

靜態庫:在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。

動態庫:在目標檔案執行時載入,手動載入,且對庫有依賴性。

具體在開發中用到哪種庫,我覺得還是根據實際的記憶體大小,rom大小,執行的速度等綜合考慮。

動態庫和靜態庫的區別

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

動態庫和靜態庫的區別

靜態庫 在程式編譯時會被鏈結到 中,程式執行時將不再需要靜態庫。字尾是lib 靜態庫的生成 生成靜態庫的時候要使用.o檔案來進行編譯生成 gcc cprint.c oprint.o ar rc libtest.a print.o gccmain.c l.ltest omain 動態庫 在程式編譯並不...

Linux動態庫和靜態庫基礎

example hello.c hello.h main.c 1.靜態庫 gcc c hello.c ar cr libhello.a hello.o 引用庫 lhello 2.動態庫 gcc c hello.c gcc shared fpci o libhello.so hello.o 引用庫 l...