鏈接方式分為兩種:靜態鏈接、動態鏈接。
靜態鏈接
由鏈接器在鏈接時將庫的內容加入到可執行程序中。
優點:
• 對運行環境的依賴性較小,具有較好的兼容性。
• 程序在運行的時候不需要庫的支持。
缺點:
• 生成的程序比較大,需要更多的系統資源,在裝入內存時會消耗更多的時間。
• 庫函數有了更新,必須重新編譯應用程序。
動態鏈接
鏈接器在鏈接時僅僅建立與所需庫函數之間的鏈接關系,在程序運行時才將所需資源調入可執行程序。
優點:
• 在需要的時候才調入對應的資源函數。
• 簡化程序的升級,有着較小的程序體積。
• 實現進程之間的資源共享(避免重復拷貝)。
缺點:
• 依賴動態庫,不能獨立運行。
• 動態庫依賴版本問題嚴重。
• 程序在運行的時候需要庫的支持。
靜態鏈接庫與動態鏈接庫
• 靜態鏈接庫在Linux中后綴為.a,以lib開頭。如:libtestlib.a
• 動態鏈接庫在Linux中后綴為.so,以lib開頭。如:libtestlib.so
• 動態編譯:gcc hello.c -o hello
• 靜態編譯:gcc hello.c -static -o hello
• 使用gcc 源文件名 -o 目標文件名時,系統默認采用動態鏈接的方式進行編譯程序,若想采用靜態編譯,加入-static參數。
• 當靜態庫與動態庫重名時,系統會優先連接動態庫,或者可以加入-static指定使用靜態庫。