C/C++編程筆記:C++靜態庫與動態庫有何不一樣?本文帶你弄懂!

在平常開發中,其實大部分時間咱們都會和第三方庫或系統庫打交道。在 Android 開發音視頻開發領域,通常會用到 FFmepg、OpenCV、OpenGL 等等開源庫, 咱們通常都會編譯成動態庫共咱們程序使用。對於類 unix 系統,靜態庫爲 .a, 動態庫爲 .so。而 windows 系統靜態庫爲 .lib, 動態庫爲.dll。編程

靜態連接庫

回顧程序編譯的四個步驟:windows

預編譯 -> 編譯 -> 彙編 -> 連接微信

靜態庫和動態庫就是在連接階段行爲不一樣,靜態庫會在連接階段將彙編生成的目標文件 .o 與引用的庫一塊兒連接打包到可執行文件中。靜態庫其實就是一系列目標文件的集合,能夠用 ar 工具打包生成。靜態庫特色有:函數

靜態庫對函數的連接在編譯時期完成工具

程序在運行時與函數庫再無關係學習

浪費資源空間,由於全部相關的目標文件都會被連接到一個可執行文件中unix

咱們來看一個例子:視頻

使用 clang 生成編譯成目標文件blog

clang++ -c Math.cpp教程

接着使用 ar 命令打包目標文件,生成靜態庫文件 libmath.a

ar -r libmath.a Math.o

ar 命令有一些經常使用參數:

(1)-t: 按順序顯示歸檔中的文件名

(2)-d: 從歸檔中刪除指定文件

連接靜態庫

clang++ main.cpp -L. -lmath -o main

生成成功後,執行 ./main 執行

解釋下參數:

(1)-L: 表示要連接的庫所在目錄,若是不指定就會在系統 usr/lib 或 usr/local/lib 下查找

(2)-l: 指定連接時的動態庫或靜態庫,若是有動態將會優先被連接

 

動態連接庫

使用動態庫的緣由,正式由於靜態庫很耗費內存空間,而且靜態庫更新簡直是災難,若是庫源碼發生變更,那麼靜態庫將不得不從新生成。

動態庫特色以下:

延遲加載一些庫函數,既用到才加載

動態庫能夠同時被多個程序共享,節省內存

藉着上面的例子,顯示動態庫的使用,首先,生成動態連接庫文件

clang++ Math.o -shared -fPIC -Wall -o libmath.so

生成動態連接庫文件後,再使用以下命令生成可執行文件

clang++ main.cpp -L. -lmath -o main

執行 ./main

參數說明:

(1)-shared: 表示生成的是動態連接庫

(2)-fPIC: 生成位置獨立的代碼,用於編譯共享庫。在任意內存空間均可以被加載

(3)-Wall: 生成全部警告信息

另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!

C語言C++編程學習交流圈子,QQ羣757874045點擊進入】微信公衆號:C語言編程學習基地

分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!

編程學習軟件分享:

編程學習視頻分享:

相關文章
相關標籤/搜索