C/C++編程筆記:C++靜態(tài)庫與動態(tài)庫有何不同?本文帶你弄懂!
在日常開發(fā)中,其實(shí)大部分時間我們都會和第三方庫或系統(tǒng)庫打交道。在 Android 開發(fā)音視頻開發(fā)領(lǐng)域,一般會用到 FFmepg、OpenCV、OpenGL 等等開源庫, 我們一般都會編譯成動態(tài)庫共我們程序使用。對于類 unix 系統(tǒng),靜態(tài)庫為 .a, 動態(tài)庫為 .so。而 windows 系統(tǒng)靜態(tài)庫為 .lib, 動態(tài)庫為.dll。

靜態(tài)鏈接庫
回顧程序編譯的四個步驟:
預(yù)編譯 -> 編譯 -> 匯編 -> 鏈接
靜態(tài)庫和動態(tài)庫就是在鏈接階段行為不同,靜態(tài)庫會在鏈接階段將匯編生成的目標(biāo)文件 .o 與引用的庫一起鏈接打包到可執(zhí)行文件中。靜態(tài)庫其實(shí)就是一系列目標(biāo)文件的集合,可以用 ar 工具打包生成。靜態(tài)庫特點(diǎn)有:
靜態(tài)庫對函數(shù)的鏈接在編譯時期完成
程序在運(yùn)行時與函數(shù)庫再無關(guān)系
浪費(fèi)資源空間,因?yàn)樗邢嚓P(guān)的目標(biāo)文件都會被鏈接到一個可執(zhí)行文件中
我們來看一個例子:



使用 clang 生成編譯成目標(biāo)文件
clang++ -c Math.cpp
接著使用 ar 命令打包目標(biāo)文件,生成靜態(tài)庫文件 libmath.a
ar -r libmath.a Math.o
ar 命令有一些常用參數(shù):
(1)-t: 按順序顯示歸檔中的文件名
(2)-d: 從歸檔中刪除指定文件
鏈接靜態(tài)庫
clang++ main.cpp -L. -lmath -o main
生成成功后,執(zhí)行 ./main 執(zhí)行
解釋下參數(shù):
(1)-L: 表示要鏈接的庫所在目錄,如果不指定就會在系統(tǒng) usr/lib 或 usr/local/lib 下查找
(2)-l: 指定鏈接時的動態(tài)庫或靜態(tài)庫,如果有動態(tài)將會優(yōu)先被鏈接

動態(tài)鏈接庫
使用動態(tài)庫的原因,正式因?yàn)殪o態(tài)庫很耗費(fèi)內(nèi)存空間,并且靜態(tài)庫更新簡直是災(zāi)難,如果庫源碼發(fā)生變動,那么靜態(tài)庫將不得不重新生成。
動態(tài)庫特點(diǎn)如下:
延遲加載一些庫函數(shù),既用到才加載
動態(tài)庫可以同時被多個程序共享,節(jié)省內(nèi)存
借著上面的例子,顯示動態(tài)庫的使用,首先,生成動態(tài)鏈接庫文件
clang++ Math.o -shared -fPIC -Wall -o libmath.so
生成動態(tài)鏈接庫文件后,再使用如下命令生成可執(zhí)行文件
clang++ main.cpp -L. -lmath -o main
執(zhí)行 ./main

參數(shù)說明:
(1)-shared: 表示生成的是動態(tài)鏈接庫
(2)-fPIC: 生成位置獨(dú)立的代碼,用于編譯共享庫。在任意內(nèi)存空間都可以被加載
(3)-Wall: 生成所有警告信息
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!

另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
