動態庫和靜態庫簡單介紹

  1. 靜態庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。程序運行的時候將不再需要靜態庫。
  • 把一些.o文件打包成一起生成了一種特殊的二進程程序,自身不能直接執行,但是可以和其他的.c/.cpp文件編譯生成了一個新的可執行程序。
  • 應用場景: 發佈小程序時,可以使用靜態庫的方式編譯生成一個單獨的可執行程序並且不依賴其他庫。發佈比較方便。
  1. 動態庫(.so):程序在運行的時候纔去鏈接動態庫的代碼,多個程序共享使用庫的代碼。
  • 把一些.c/.cpp文件編譯生成了一種特殊的二進制文件,自身不能直接執行,但是可以被其他的可執行程序調用。
  • 應用場景:客戶端更新的時候不必更新整個程序,而是更新其中的一部分模塊,其中的模塊就是以動態庫的方式組織的。

一個與動態庫鏈接的可執行文件僅僅包含它用到的函數入口地址的一個表,而不是外部函數所在目標文件的整個機器碼。
在可執行文件開始運行以前,外部函數的機器碼由操作系統從磁盤上的該動態庫中負責到內存中,這個過程稱爲動態鏈接。
動態庫可以在多個程序間共享,所以動態鏈接使得可執行文件更小,節約了磁盤空間。操作系統採用虛擬內存機制運行物理內存中的一份動態庫被要用到該庫的所以進程共用,節約了內存和磁盤空間。

命名規則:lib前綴 .a後綴(靜態庫) .so後綴(動態庫)

ldd [xxx] 查看依賴關係,依賴那些動態庫
LD_LIBRARY_PATH 設定這個環境變量提醒系統去哪些目錄中查找動態庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章