linux下靜態庫和動態庫的區別

2021-08-05 19:11:09 字數 1984 閱讀 6639

一、引言

我們通常把一些公用函式製作成函式庫,供其它程式使用。

函式庫分為靜態庫和動態庫兩種。

通常情況下,對函式庫的鏈結是放在編譯時期(compile time)完成的。所有相關的物件檔案(object file)與牽涉到的函式庫(library)被鏈結合成乙個可執行檔案(executable file)。程式在執行時,與函式庫再無瓜葛,因為所有需要的函式已拷貝到相應目錄下下。所以這些函式庫被成為靜態庫(static libaray),通常檔名為「lib***.a」的形式。

其實,我們也可以把對一些庫函式的鏈結載入推遲到程式執行的時期(runtime)。這就是動態鏈結庫(dynamic link library)技術。

二、兩者區別: 

a,靜態庫的使用需要: 

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

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

b,動態庫的使用: 

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

c,依賴性:

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

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

d,區別: 

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

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

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

鏈結靜態庫,編譯的可執行檔案比較大,當然可以用strip命令精簡一下(如:strip libtest.a),但還是要比鏈結動態庫的可執行檔案大。程式執行時間速度稍微快一點。

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

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

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

三、動態鏈結庫的特點與優勢

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

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

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

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

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

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

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

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

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

0 給主人留下些什麼吧!~~

linux 下靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該 靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在 linux中如何建立...

linux下的靜態庫和動態庫

庫是什麼?在我們實際程式設計中,經常會引入各種庫函式,那麼庫是什麼?從本質上來說是一種可執行 的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。靜態庫 linux下靜態庫的名字一般是lib a,為庫的名字。利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,...

linux下的靜態庫和動態庫

意義 為了避免 的重寫率,我們可以將已經寫好的 形成乙個庫,當我們再次用到的時候可以直接呼叫,而不是重新去寫,即 站在巨人的肩膀上 linux下有兩種庫 一 靜態庫 準備工作 int swap int x,int y include int main 1 將我們需要的函式生成乙個.o 檔案 root...