二者的不同點在於**被載入的時刻不同。
靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫,
因此體積較大
動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,
因此在程式執行時還需要動態庫存在,因此**體積較小。
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的**都從零開始,
因此庫的存在意義非同尋常。
共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有一
份該共享庫的例項。
靜態庫對函式庫的鏈結是放在編譯時期(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下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...