Linux下靜態庫與動態庫的製作

2021-10-09 06:28:09 字數 1397 閱讀 9691

二者的不同點在於**被載入的時刻不同。

靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫,

因此體積較大

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

因此在程式執行時還需要動態庫存在,因此**體積較小。

現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的**都從零開始,

因此庫的存在意義非同尋常。

共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有一

份該共享庫的例項。

靜態庫對函式庫的鏈結是放在編譯時期(compile time)完成的。

程式在執行時與函式庫再無瓜葛,移植方便

浪費空間和資源,因為所有相關的物件檔案(object file)與牽涉到的函式

庫(library)被鏈結合成乙個可執行檔案(executable file)。

建立靜態庫:

1)生成製作庫檔案所需的功能函式的可重定向檔案

gcc -c fun.c -o fun.o

2)生成靜態庫檔案

ar crs libfun.a fun.o

lib 表示庫檔案,一般不能省略

fun 表示庫的名字

.a 表示靜態庫

3)靜態庫生效

gcc main.c -o main -l. –lfun

-l 指定庫的路徑

-l 指定庫的名字

4)檢視庫中的符號資訊

nm libfun.a

動態庫把對一些庫函式的鏈結載入推遲到程式執行的時期(runtime)。

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

將一些程式公升級變得簡單。

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

建立共享庫:

1)生成製作庫檔案所需的功能函式的可重定向檔案

gcc -fpic -c fun.c -o fun.o

-fpic 生成與位置無關的**(生成的動態庫檔案在記憶體上

可以自動尋找一塊合適的記憶體區域)

2)生成動態庫檔案

gcc -shared fun.o -o libfun.so

.so 表示動態庫檔案

2)gcc main.c -o main -l. -lfun

為了讓執行程式順利找到動態庫,有三種方法 :

(1) 把庫拷貝到/lib目錄下。

(2) 在ld_library_path環境變數中加上庫所在路徑。

(3) 新增/etc/ld.so.conf.d/*.conf檔案,把庫所在的路徑加到檔案末尾,

並執行ldconfig重新整理。這樣,加入的目錄下的所有庫檔案都可見。

Linux下的靜態庫與動態庫

準備三個檔案 time.c time.h test.c。函式庫的標頭檔案 ifndef time h define time h includevoid time endif time h 函式庫的源程式,包含時間列印函式 include time.h void time 測試函式,呼叫了時間列印函...

Linux下的靜態庫與動態庫

1 生成.so g test.cpp fpic shared o libtest.so 2 使用.so g l.ltest main.cpp 在使用.so的時候如果找不到.so需要把.so的路徑加到 etc ld.so.conf ldconfig使之生效 ldd 可以檢視main中是否包含了.so。...

Linux下的靜態庫與動態庫

在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...