在日常開發中,其實大部分時間我們都會和第三方庫或系統庫打交道。
在 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 指令有一些常用參數:
● -t: 按順序顯示歸檔中的檔案名;
● -d: 從歸檔中删除指定檔案。
連結靜态庫:
clang++ main.cpp -L. -lmath -o main
生成成功後,執行 ./main 執行
解釋下參數:
● -L: 表示要連結的庫所在目錄,如果不指定就會在系統 usr/lib 或 usr/local/lib 下查找;
● -l: 指定連結時的動态庫或靜态庫,如果有動态将會優先被連結。
動态連結庫
使用動态庫的原因,正式因為靜态庫很耗費記憶體空間,并且靜态庫更新簡直是災難,如果庫源碼發生變動,那麼靜态庫将不得不重新生成。
動态庫特點如下:
● 延遲加載一些庫函數,既用到才加載;
● 動态庫可以同時被多個程式共享,節省記憶體。
借着上面的例子,顯示動态庫的使用,首先,生成動态連結庫檔案
clang++ Math.o -shared -fPIC -Wall -o libmath.so
生成動态連結庫檔案後,再使用如下指令生成可執行檔案
執行 ./main
參數說明:
● -shared: 表示生成的是動态連結庫
● -fPIC: 生成位置獨立的代碼,用于編譯共享庫。在任意記憶體空間都可以被加載
● -Wall: 生成所有警告資訊
最後,不管你是轉行也好,初學也罷,進階也可,如果你想學程式設計~
——【值得關注】我的 C/C++程式設計學習交流俱樂部!——
涉及:C語言、C++、windows程式設計、網絡程式設計、QT圖形界面開發、Linux程式設計、遊戲程式設計、資料結構與算以及資料庫......