1. 程式人生 > >Linux 動態庫和靜態庫

Linux 動態庫和靜態庫

Linux作業系統中,依據函式庫是否被編譯到程式內部,將其分為兩大類,靜態函式庫和動態函式庫。

Linux下的函式庫放在/lib或/usr/lib,標頭檔案放在/usr/include。

在既有靜態庫又有動態庫的情況下,預設使用動態庫,如果強制使用靜態庫則需要加-static選項支援。

 

關於靜態庫

1.拓展名通常為libxxx.a。

2.靜態庫在編譯時會直接整合到執行程式當中,因此用靜態庫編譯成的檔案會比較大。

3.優點:用其編譯成功的可執行檔案可以獨立執行,不需再要向外部要求讀取函式庫的內容。

4.缺點:因為靜態庫是直接整合到可執行檔案中的,所以其改變時,整個可執行檔案都要重新編譯才能將新的函式庫 整合到程式中,所以升級靜態庫會比較麻煩。另外就是2中提到的體積大。

5.建立:gcc -c file1.c

        gcc-c file2.c

                        ......

        gcc -c filen.c

        ar -rcs libname.a file1.o file2.o ... fileN.o

        //ar:靜態函式庫建立的命令

        //-c:create替換

        //-r:replace。表示如果當前插入的模組名已在庫中存在,則替換同名的模組;如果其中有一個模組在庫 中不存在,則ar會顯示一個錯誤資訊,並不替換其他同名的模組。預設情況下,新的成員增加在庫的結尾處。

 

關於動態庫(共享庫)

1.拓展名通常為libxxx.so。

2.動態函式庫並未被整合到可執行檔案中,而是當可執行檔案要使用到函式庫的機制時,程式才會去讀取函式庫來使 用。使用動態庫的可執行檔案具有指向指向動態函式庫的Pointer,不包含函式庫內容,因此相比之下檔案較小。 尤其是在多個程式同時使用一個函式庫的情況下,使用動態庫可以大大減少檔案的佔用空間。

3.優點:由於具有指向功能,所以當動態庫改變時並不影響程式(前提是函式庫的檔名不變),故其升級較靜態庫 方便很多。

4.缺點:使用動態庫編譯出來的檔案不可以被獨立執行,且可執行檔案裡的Point是固定的,即程式讀取動態庫的路 徑是一定的,所以動態庫不可以隨便移動或刪除。

 

5.建立:gcc -shared -fpic -o libname.so file1.c file2.c ... fileN.c

 

 

 

 

使用

gcc file.c -L. -lname -I. 

//-L指定函式庫查詢位置

//-l指定需要操作的庫名(沒有lib也沒有.a)

//-I指定標頭檔案件查詢位置

當使用靜態庫時,直接./a.out就可以執行程式;當使用動態庫時,系統會去/uer/lib中載入動態庫,如果該動態庫沒有在這個路徑下直接執行時則會報錯,這是可以將庫拷貝到此路徑下,也可以使用環境變數LD_LLIBRARY_PATH,使其等於當前函式庫對應路徑以實現目的。