在日常開發中,其實大部分時間我們都會和第三方庫或系統庫打交道,在 Android 開發音視頻開發領域,一般會用到 FFmepg、OpenCV、OpenGL 等等開源庫, 我們一般都會編譯成動態庫共我們程式使用,對于類 unix 系統,靜態庫為 .a, 動態庫為 .so,而 windows 系統靜態庫為 .lib, 動態庫為.dll,
靜態鏈接庫
回顧程式編譯的四個步驟:
預編譯 -> 編譯 -> 匯編 -> 鏈接
靜態庫和動態庫就是在鏈接階段行為不同,靜態庫會在鏈接階段將匯編生成的目標檔案 .o 與參考的庫一起鏈接打包到可執行檔案中,靜態庫其實就是一系列目標檔案的集合,可以用 ar 工具打包生成,靜態庫特點有:
靜態庫對函式的鏈接在編譯時期完成
程式在運行時與函式庫再無關系
浪費資源空間,因為所有相關的目標檔案都會被鏈接到一個可執行檔案中
我們來看一個例子:
使用 clang 生成編譯成目標檔案
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語言編程學習基地
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習軟體分享:

編程學習視頻分享:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/101157.html
標籤:C++
