1. 程式人生 > >Linux下怎麼建立動態庫和靜態庫

Linux下怎麼建立動態庫和靜態庫

前言

linux下的生成的動態庫和靜態庫沒有windows下方便 linux下gcc編譯預設動態連結和release

程式執行後呼叫動態庫

動態庫:

程式在執行的時候才去連結動態庫的程式碼,多個程式共享使用庫的程式碼

可執行檔案裡包含的不是庫,只是包含用到的函式入口地址一個表

一個動態庫連結的可執行檔案僅僅包含它用到函式的入口地址的一個表,而不是外部函式所在目標檔案的整個機器碼

什麼載入到記憶體,準備執行之前

在可執行檔案開始執行以前,外部函式的機器碼由作業系統從磁碟上的該動態庫中複製到記憶體中,這個過程稱為動態連結

動態連結的好處

動態庫可以在多個程式間共享,所以動態連結庫使得可執行檔案更小,節省了磁碟空間。作業系統採用虛擬記憶體機制允許實體記憶體中的一份動態庫被要用到該庫的所有程序共用,節省了記憶體的磁碟空間

編譯連結程式連結靜態庫

靜態庫:

程式在編譯連結的時候把庫的程式碼連結到可執行檔案中。程式執行的時候將不在需要靜態庫

生成靜態庫

1.建立四個檔案

main.c add.c sub.c sub.h add.h

2.寫好程式碼

3.然後分別生成 sub.o 和 add.o

gcc -c sub.c -o sub.o gcc -c add.c -o add.o

4.將sub.o和add.o打包起來生成libmymath.a

ar -rc libmymath.a *.o

5.生成可執行檔案a.out

gcc main.c -L. -I. -lmymath

生成動態庫

1.用位置無關碼生成sub.o和add.o

gcc -fPIC sub.c add.c

2.生成動態庫

gcc -shared libmymath *.o

3.生成可執行檔案main

gcc main.c -L. -I. -lmymath -o main

4.此時ldd發現main找不到動態庫,要修改環境變數。

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:yourpath

5.這個時候main找到了,完成