靜態庫與動態庫

2021-09-28 16:44:41 字數 1997 閱讀 3142

結論:

庫中包含的是讓使用者呼叫的一些函式,有了庫,程式中不需要自己實現這些函式,直接呼叫庫中的函式即可,節約開發時間,提高開發效率;

8.靜態庫的特點

編譯(鏈結)時把靜態庫中相應的**複製到可執行檔案中,有以下兩個特點:

1> 程式中已包含**,執行時不再需要靜態庫

注意:複製時,複製的是靜態庫中部分**,即程式中呼叫了哪些函式,就會把這些函式的**複製進來,而非整個庫檔案複製進來;

2> 程式執行時無需載入庫,執行速度更快;

缺點:

1> 占用更多的磁碟和記憶體空間

2> 靜態庫公升級後,程式需要重新編譯鏈結

9.靜態庫的建立

1> 庫名

以lib開始,以.a結束,.a表示靜態庫

一般庫名代表庫中函式的功能,比如:libc,代表c庫,libm代表數學庫等;

庫中的目標檔案可以是乙個.o,也可以是多個.o

2> 靜態庫的建立

1)確定庫中函式的功能,介面

2) 編寫庫的原始碼

3)編譯庫原始碼,生成二進位制檔案

4)寫測試**,呼叫庫中**

3>檢視庫中符號資訊,即庫中包含的函式名稱

nm 庫檔名

eg:nm libcommon.a

1.共享庫的特點

編譯(鏈結)時僅記錄用到哪個共享庫的哪個符號(一般指函式名),不複製共享庫中的**;

1>程式不包含庫中的** 尺寸小;

2>多個程式可共用同乙個庫;

3> 程式執行時需要載入庫;

4> 庫公升級方便,無需重新編譯程式;

2.共享庫的建立

1>確定庫中函式的功能,介面

2>建立共享庫檔案

3>編寫共享庫原始碼

4>為共享庫檔案建立符號鏈結檔案

5> 鏈結共享庫檔案

注意:

-fpic的作用:

告訴編譯器,生成與位置無關的**;即生成的.o檔案中的**可以被載入到任意位址執行,而非只能在固定位址執行;

原因:

3.執行時找不到庫的原因:

因為程式執行時鏈結共享庫,而沒有複製共享庫中的**,所以,程式執行時,系統會引導程式中用到的共享庫,載入時回去預設

路徑,比如:/lib /usr/lib 下找共享庫,而共享庫沒有放在預設路徑下,所以會報錯;

.1製作靜態庫

1.將標頭檔案發布到/usr/local/include

sudo mv test.h /usr/local/include

2.將庫函式.c檔案編譯成.o檔案

gcc -c test.c -o test.o

3.生成靜態庫

ar -cr lib庫名.a test.o

//例如 ar -cr libstat.a test.o

4.將庫函式發布到/usr/local/lib

sudo mv lib庫名.a /usr/local/lib

5.編譯主函式的時候加上鏈結

gcc main.c -l庫名

gcc main.c -l庫的路徑

.2製作動態庫

1.將標頭檔案發布到/usr/local/include

sudo mv test.h /usr/local/include

2.將庫函式.c檔案編譯成動態庫檔案

gcc -shared -fpic test.c -o lib庫名.so

3.將庫檔案發布到/usr/local/lib

sudo mv lib庫名.so /usr/local/lib

4.在/etc/ld.so.conf.d/libc.conf最後一行新增庫檔案的路徑

/usr/local/lib

5.重新整理配置檔案

sudo ldconfig

6.gcc main.c -l庫名

ldd 可執行程式 //檢視當前程式所使用的動態庫有哪些

靜態庫與動態庫

linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...

靜態庫與動態庫

庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...

靜態庫與動態庫

1.靜態庫 工程在呼叫靜態庫時,複製靜態庫,源 加長,不節省程式空間。字尾名.a 優點 程式設計後不需要再依賴庫 以空間換時間 建立靜態庫 gcc c 原始檔.c ar rcs rcu 靜態庫名 目標檔案1 目標檔案2 rc 靜態庫不存在,就建立該庫檔案 s 更新靜態庫 使用 gcc o file ...