Linux靜態庫和動態庫

2021-09-27 10:16:21 字數 2957 閱讀 5145

文章**:

靜態庫的名字一般是lib***.a,利用靜態庫編譯生成的檔案比較大,因為整個靜態庫所有的資料都會被整合進目標**中。

a)優點

編譯後,可執行檔案不需要外部支援;

b)缺點

生成的可執行程式大;靜態庫改變了,就需要重新編譯可執行程式。

動態庫的名字一般是lib***.so,相對於靜態庫,動態函式庫在編譯的時候並沒有被編譯進目標**中,你的程式執行到相關函式時才呼叫函式庫裡面相應的函式,因此使用動態函式庫生成的可執行檔案比較小。由於函式庫沒有編譯進可執行程式,而是程式執行時動態的申請呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變也不會影響可執行程式,針對可執行程式的動態函式庫公升級也比較容易。

優點

實現程序的資源共享,當程式在執行的時候需要呼叫某個動態鏈結庫函式時候,os會先檢視所有正在執行的程式,看記憶體裡面是否已經有此函式的拷貝了,有責共享那個拷貝,沒有才會鏈結載入,這樣會大大節省os的記憶體資源;

公升級容易,公升級動態鏈結庫即可,不需要重新編譯可執行程式;

通常,對函式的鏈結是在編譯期的時候完成的,所有相關的物件檔案與相關聯的library被鏈結成乙個可執行檔案,這就是使用靜態庫的編譯過程,而動態庫技術:對一些庫函式的鏈結載入推遲到程式執行的時候。

但是,不管是使用靜態庫還是使用動態庫,這些庫檔案都是由*.o檔案生成的,在給編譯器gcc傳不同的引數,就會生成相應的靜態庫或者是動態庫了。

a)建立靜態庫:

在linux環境下,建立靜態庫是使用ar命令,具體的選項可以man檢視下,例子:

//假如同目錄下有main.cpp,test.cpp,error.cpp三個檔案,執行如下

//生成.o檔案

g++ -c test.cpp error.cpp

//執行這步編譯生成test.o和error.o檔案

//生成靜態庫

ar -rt libtest.a error.o test.o

ar cr libtest.a error.o test.o

//使用靜態庫

g++ main.cpp -l./ -ltest -o main.exe

注意:

-l:指定靜態庫的搜尋路徑

-l:指定靜態庫/動態庫名稱,不需要攜帶字首lib和字尾.a或.so

b)建立動態庫:

使用gcc編譯.c檔案的使用,使用-fpic標籤,然後在使用*.o檔案生成動態庫檔案的時候,傳遞-shared標籤給gcc,例子:

gcc  –fpic  –c  file1.c

gcc -fpic -c file2.c

gcc –shared libtest.so file1.o file2.o

這樣就建立了libtest.so動態庫檔案。

動態庫檔案和靜態庫檔案的使用方法基本上差不多,在gcc的command裡面使用-lpath和-l***標籤:

格式:gcc file1.o file2.o –lpath –l*** –o yourprogrammer

舉例:gcc file1.o file2.o –l.

/ –ltest –o test //test為可執行程式

編譯器會先到path下面尋找lib***.so檔案,如果沒有找到,繼續尋找lib***.a檔案。

那麼動態庫函式檔案,是在程式執行的過程中決定是否載入的,那麼我們需要告訴編譯器,去**能找到動態庫函式檔案,在linux或者類unix作業系統裡面是使用ld_library_path環境變數來實現的。

參考資料:

文章**:

靜態庫的名字一般是lib***.a,利用靜態庫編譯生成的檔案比較大,因為整個靜態庫所有的資料都會被整合進目標**中。

a)優點

編譯後,可執行檔案不需要外部支援;

b)缺點

生成的可執行程式大;靜態庫改變了,就需要重新編譯可執行程式。

動態庫的名字一般是lib***.so,相對於靜態庫,動態函式庫在編譯的時候並沒有被編譯進目標**中,你的程式執行到相關函式時才呼叫函式庫裡面相應的函式,因此使用動態函式庫生成的可執行檔案比較小。由於函式庫沒有編譯進可執行程式,而是程式執行時動態的申請呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變也不會影響可執行程式,針對可執行程式的動態函式庫公升級也比較容易。

優點

實現程序的資源共享,當程式在執行的時候需要呼叫某個動態鏈結庫函式時候,os會先檢視所有正在執行的程式,看記憶體裡面是否已經有此函式的拷貝了,有責共享那個拷貝,沒有才會鏈結載入,這樣會大大節省os的記憶體資源;

公升級容易,公升級動態鏈結庫即可,不需要重新編譯可執行程式;

通常,對函式的鏈結是在編譯期的時候完成的,所有相關的物件檔案與相關聯的library被鏈結成乙個可執行檔案,這就是使用靜態庫的編譯過程,而動態庫技術:對一些庫函式的鏈結載入推遲到程式執行的時候。

但是,不管是使用靜態庫還是使用動態庫,這些庫檔案都是由*.o檔案生成的,在給編譯器gcc傳不同的引數,就會生成相應的靜態庫或者是動態庫了。

a)建立靜態庫:

在linux環境下,建立靜態庫是使用ar命令,具體的選項可以man檢視下,例子:

//假如同目錄下有main.cpp,test.cpp,error.cpp三個檔案,執行如下

linux 靜態庫和動態庫

1.生成方式 靜態庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 然後生成靜態庫 ar rc libstatic.a test.o 共享庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 生成共享庫 gcc fpic shared o libsha...

Linux 靜態庫和動態庫

庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的include標頭檔案。我們先來回顧一下程式編譯的過程。如下圖 庫 本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫 缺點是 檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大 下面實現乙個靜態...

Linux 靜態庫和動態庫

我們指定c程式從 到乙個可執行程式需要經過預處理 編譯 彙編 鏈結。而最後一步鏈結又分為動態鏈結與靜態鏈結。靜態鏈結相當於就是講所要鏈結的庫提前放入鏈結的檔案,這樣子的檔案體積較大,但是可移植性較高。而動態鏈結是在執行的時候才去主動鏈結所需要鏈結的庫,這樣的 體積較小,多個程式共同使用庫的 我們li...