天天看點

【一起學程式設計】C++中靜态庫與動态庫的差別!

        在日常開發中,其實大部分時間我們都會和第三方庫或系統庫打交道。

        在 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程式設計、遊戲程式設計、資料結構與算以及資料庫......

繼續閱讀