1. 程式人生 > >【linux】靜態庫及動態庫

【linux】靜態庫及動態庫

動態庫與靜態庫概念

1.靜態庫(.a)

程式在編譯連結時把庫的程式碼連結到可執行檔案之中,程式執行的時間不需要依賴庫。可移植性強,一旦編譯成功不需要靜態庫,但是每一次都要講程式碼連結進去,生成的可執行程式較大,浪費磁碟空間。

2.動態庫(.so)

  • 程式在執行的時候才去連結動態庫的程式碼,多個程式共享使用庫的程式碼。在程式執行時,才連結庫,相比靜態庫執行程式碼少節省空間,可以共享(虛擬記憶體機制),但是可移植性差,不能刪除。動態函式庫(windows的檔案字尾是.dll)與共享物件庫(linux的字尾是.so)是一個東西
  • 一個與動態庫連結的可執行檔案僅僅包括它用到的函式入口地址的一個表,而不是外部函式所在目標檔案的整個機器碼。
  • 在可執行檔案開始執行以前,外部函式的機器碼由OS從磁碟上的該動態庫複製到記憶體中這個過程叫做動態連結
  • 動態庫可以在多個程式間共享,所以動態連結使得可執行檔案更小,節省了磁碟空間,OS採用虛擬記憶體機制允許實體記憶體中的一份動態庫被要用到該庫的所有程序共有,節省了記憶體和磁碟空間。

庫在連線以後引進程序說明了什麼?

這個庫複合翻譯標準,不管是靜態庫,還是動態庫都變為二進位制,因為只有二進位制才能把內容拿出來。

實現加法和減法的靜態庫

  • 先寫好標頭檔案與函式檔案 在這裡插入圖片描述
  • gcc -c sub.c -0 sub.o利用該指令生成二進位制.o檔案
  • ar -rc libmymath.a sub.o add.o
    將.o檔案打成靜態庫
  • ar -tv libmymath.a(-t列出靜態庫的檔案,-v詳細資訊)檢視靜態庫的目錄檔案
  • gcc test.c -L -lmymath使用庫 -L 指定庫路徑,-l指定匿名
  • 上述過程可以用makefile完成
libmymath.a:sub.o add.o
	ar -rc [email protected] $^
sub.o:sub.c
	gcc -c $^ -o [email protected]
add.o:add.c
	gcc -c $^ -o [email protected]
.PHONY:clean
clean:
	rm -rf *.o libmymath.a

  • 可以建立一個目錄將靜態庫的檔案放進去

在這裡插入圖片描述

使用gcc test.c -L ./COUNT/lib -lmymath -I ./COUNT/include便可呼叫靜態庫

庫搜尋路徑 在這裡插入圖片描述

實現加法和減法動態庫

  • 先寫好標頭檔案與函式檔案 在這裡插入圖片描述

  • gcc -fPIC -c sub.c add.c生成二進位制檔案

  • gcc -shared -o libmymath.so *.o生成動態庫

  • gcc -L. -lmymath main.c 使用動態庫

執行動態庫另外方法

  • 將動態庫拷貝到系統預設搜尋路徑,
  • 將動態庫的路徑加入到LD_LIBRARY_PATH