在平常開發中,其實大部分時間咱們都會和第三方庫或系統庫打交道。在 Android 開發音視頻開發領域,通常會用到 FFmepg、OpenCV、OpenGL 等等開源庫, 咱們通常都會編譯成動態庫共咱們程序使用。對於類 unix 系統,靜態庫爲 .a, 動態庫爲 .so。而 windows 系統靜態庫爲 .lib, 動態庫爲.dll。
靜態連接庫
回顧程序編譯的四個步驟:
預編譯 -> 編譯 -> 彙編 -> 連接
靜態庫和動態庫就是在連接階段行爲不一樣,靜態庫會在連接階段將彙編生成的目標文件 .o 與引用的庫一塊兒連接打包到可執行文件中。靜態庫其實就是一系列目標文件的集合,能夠用 ar 工具打包生成。靜態庫特色有:node
咱們來看一個例子:
// 頭文件 Math.hpp #ifndef Math_hpp #define Math_hpp #include <stdio.h> extern int add(int a, int b); #endif /* Math_hpp */ // Math.hpp 實現文件 #include "Math.hpp" int add(int a, int b) { return a + b; } // main.cpp main 函數入口 #include <iostream> extern int add(int a, int b); int main(int argc, const char * argv[]) { // insert code here... using std::cout; using std::endl; cout << "add 2 3: " << add(2, 3) << endl; return 0; }
連接靜態庫
clang++ main.cpp -L. -lmath -o main
生成成功後,執行 ./main 執行ios
解釋下參數:c++
動態連接庫
使用動態庫的緣由,正式由於靜態庫很耗費內存空間,而且靜態庫更新簡直是災難,若是庫源碼發生變更,那麼靜態庫將不得不從新生成。
動態庫特色以下:面試
藉着上面的例子,顯示動態庫的使用,首先,生成動態連接庫文件
clang++ Math.o -shared -fPIC -Wall -o libmath.so
生成動態連接庫文件後,再使用以下命令生成可執行文件
clang++ main.cpp -L. -lmath -o main
執行 ./main
參數說明:objective-c
若是以爲本文不錯,那就點個關注吧~ 關於更多的面試資料我已經整理成相關文檔,須要的朋友能夠點擊獲取。windows