文章**:
靜態庫的名字一般是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
注意:b)建立動態庫:-l:指定靜態庫的搜尋路徑
-l:指定靜態庫/動態庫名稱,不需要攜帶字首lib和字尾.a或.so
使用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...