linux 靜態庫 動態庫

2021-06-09 05:58:17 字數 1575 閱讀 7729

1.概念和區別:

靜態庫就是在編譯過程中一些目標檔案的集合。靜態庫在程式鏈結的時候使用,鏈結器會將程式中使用到函式的**從庫檔案中拷貝到應用程式中。一旦鏈結完成,在執行程式的時候就不需要靜態庫了。

由於每個使用靜態庫的應用程式都需要拷貝所用函式的**,所以靜態鏈結的檔案會比較大。

相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目標**中,而只是作些標記。然後在程式開始啟動執行的時候,動態地載入所需模組,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態的申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的公升級比較方便。

2.命名:

靜態庫的名字一般為lib***x.a,其中***x是該lib的名稱。

動態庫的名字一般為lib***x.so.major.minor,***x是該lib的名稱,major是主版本號,minor是副版本號。版本號也可以沒有,一般都會建立個沒有版本號的軟連線檔案鏈結到全名的庫檔案。

3.建立:

無論靜態庫還是動態庫,建立都分為兩步,第一步建立目標檔案,第二步生產庫。

1).靜態庫的建立:

#gcc -c test.c -o test.o

#ar rcs libtest.a test.o

名字為libtest.a的靜態庫就生產了,其中選項:

r 表明將模組加入到靜態庫中;

c 表示建立靜態庫;

s 表示生產索引;

還有更多選項像增加、刪除庫中的目標檔案,包括將靜態庫解包等可以通過man來獲得。

2).動態庫的建立:

#gcc -fpic -c test.c -o test.c

#gcc --share test.o -o libtest.so

-fpic 為了跨平台

4.使用:

編譯鏈結目標程式的方法是一樣的:

#gcc main.c -l. -ltest -o main

-l.指定現在本目錄下搜尋庫,如果沒有,會到系統預設的目錄下搜尋,一般為/lib、/usr/lib下。

對於靜態庫,這個步驟之後就可以將libtest.a庫刪掉,因為它已經被編譯進了目標程式,不再需要它了。

而對於動態庫,libtest.so庫只是在目標程式裡做了標記,在執行程式時才會動態載入,那麼從哪載入呢?載入目錄會由/etc/ld.so.conf來指定,一般預設是/lib、/usr/lib,所以要想讓動態庫順利載入,你可以將庫檔案copy到上面的兩個目錄下,或者設定export ld_library_path=$ld_library_path:/***/yyy,後面為你自己動態庫的目錄,再或者修改/etc/ld.so.conf檔案,把庫所在的路徑加到檔案末尾,並執行ldconfig重新整理。這樣,加入的目錄下的所有庫檔案都可見。

另外還有個檔案需要了解/etc/ld.so.cache,裡面儲存了常用的動態函式庫,且會先把他們載入到記憶體中,因為記憶體的訪問速度遠遠大於硬碟的訪問速度,這樣可以提高軟體載入動態函式庫的速度了。

最後提一點,當同一目錄下既有動態庫又有靜態庫,並且兩個庫的名字相同時,編譯時會如何鏈結呢?

gcc編譯時預設都是動態鏈結,如果要指定優先鏈結靜態庫,需要指定引數static。

linux 靜態庫 動態庫

linux支援兩種庫的型別 靜態庫和動態庫 共享庫 1.linux靜態庫和動態庫的命名規則 靜態函式庫 lib a 動態函式庫 lib so 這些庫檔案都是由 o檔案生成的 動態庫 程式執行過程中進行連線。可執行檔案 庫檔案 靜態庫 編譯時進行連線。庫檔案 的複製貼上過程。程式執行時先檢查依賴的庫檔...

Linux動態庫,靜態庫

1.庫是什麼?庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。就是將源 轉化為二進位制格式的源 相當於進行了加密,別人可以使用庫,但是看不到庫中的內容。2.靜態庫 靜態函式庫時在程式執行之前 編譯 就加入到目標程式中去了 linux中命名系統中靜態庫庫的規則 靜態庫檔名的命名方式是 l...

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...