1. 程式人生 > >動態與靜態函數庫學習

動態與靜態函數庫學習

想要 onf 如果 需要 系統 xxx 新的 用法 post

前言

軟件之間都會互相使用彼此提供的函數庫來進行特殊功能的運行。

函數庫依照是否被編譯到程序內部而分為動態函數庫靜態函數庫

靜態函數庫

特點

  • 擴展名(.a):這類函數庫擴展名為 libxxx.a 類型。
  • 編譯行為:這類函數庫在編譯的時候會直接整合到可執行程序中,所以利用靜態函數庫編譯成的文件會比較大一些
  • 獨立執行的狀態:這類函數庫最大的優點就是編譯成功的可執行文件可以獨立運行,而不需要再向外部要求讀取函數庫的內容。
  • 升級難易度:雖然可執行文件可以獨立運行,但是因為函數庫是直接整合到可執行文件中,因此如果函數庫升級時,整個可執行文件必須重新編譯才能將新版本的函數庫整合到程序中。也就是說,在升級方面,只要函數庫升級了,所以將此函數庫納入的程序都需要重新編譯。

動態函數庫

特點

  • 擴展名(.so):這類函數庫擴展名為 libxxx.so 類型。
  • 編譯行為:動態函數庫在編譯的時候,在程序裏面只有一個“指向”(Pointer)的位置而已。也就是說,動態函數庫的內容並沒有被整合到可執行文件中,而是當可執行文件要使用到函數庫的機制時,程序才會去讀取函數庫來使用。由於可執行文件當中僅具有指向動態函數庫所在的指標而已,並不包含函數庫的內容,所有它的文件會比較小一點
  • 獨立執行的狀態:這類函數庫所編譯出來的程序不能被獨立執行,因為當我們使用到函數庫的機制時,程序才會去讀取函數庫,所以函數庫文件必須要存在才行,而且,函數庫所在的目錄也不能改變,因為我們的可執行文件裏面僅有“指標”,也就是要取用該動態函數庫時,程序會主動去某個路徑下讀取,所以動態函數庫可不能隨意移動或刪除,會影響很多相關的程序軟件。
  • 升級難易度:函數庫升級後,可執行文件根本不需要進行重新編譯,因為可執行文件會直接指向新的函數庫文件(前提是函數庫新舊版本的文件名相同)。

在目前的Linux distribution傾向使用動態函數庫,絕大多數函數庫放置在/usr/lib、lib目錄下。此外,Linux系統裏面很多的函數庫其實kernal就提供了,kernal的函數庫在/lib/modules裏面。

ldconfig 與 /etc/ld.so.conf

由於內存的訪問速度是硬盤的好幾倍,所以,如果將常用到的動態函數庫先加載到內存當中(緩存,cache),那當軟件要使用動態函數庫時,就不需要從頭由硬盤裏面讀出,這樣就增進動態函數庫的讀取速度

,要完成這種操作就需要 ldconfig 和 /etc/ld.so.conf 的協助。

將動態函數庫加載高速緩存當中的步驟:

  1. 首先,必須在 /etc/ld.so.conf 裏面寫下想要讀入高速緩存當中的動態函數庫所在的目錄,是目錄而不是文件。
  2. 接下來利用 ldconfig 這個可執行文件將 /etc/ld.so.conf 的數據讀入高速緩存當中。
  3. 同時也將數據記錄一份在 /etc/ld.so.cache 這個文件當中。
  4. //TODO ldconfig用法

動態與靜態函數庫學習