Linux 系統 靜態庫與動態庫 學習筆記

Linux 系統 靜態庫與動態庫 學習筆記

前言

庫是一種可執行代碼的二進制格式,能夠被載入到內存中執行,庫分靜態庫和動態庫(共享庫)兩種:

靜態庫

這類庫的名字一般是libxxx.a,拓展名爲.a,xxx爲庫的名字。

利用靜態函數庫編譯成的文件比較大,因爲整個函數庫的所有數據都會被整合進目標代碼中,他的優點就顯而易見了,即編譯後的執行程序不需要外部的函數庫支持,因爲所有使用的函數都已經被編譯進去了。當然這也會成爲他的缺點,因爲如果靜態函數庫改變了,或更新了,那麼你的程序必須重新編譯。

動態庫(共享庫)

這類庫的名字一般是libxxx.solibxxx.so.M.N,拓展名爲.so

同樣的xxx爲庫的名字,M是庫的主版本號,N是庫的副版本號。當然也可以不要版本號,但名字必須有。

相對於靜態函數庫,動態函數庫在編譯的時候並沒有被編譯進目標代碼中,你的程序執行到相關函數時才調用該函數庫裏的相應函數,因此動態函數庫所產生的可執行文件比較小。由於函數庫沒有被整合進你的程序,而是程序運行時動態的申請並調用,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變並不影響你的程序,所以動態函數庫的升級比較方便。linux系統有幾個重要的目錄存放相應的函數庫,如:/lib /usr/lib

當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的缺省操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。

下面主要記錄動態庫(共享庫)的管理。

動態庫(共享庫)的使用與管理

通常最重要的動態庫地址爲:

/lib 
/lib64 # 64系統

/usr/lib
/usr/lib64

在編譯軟件中動態庫的使用

  1. 修改軟件源代碼,指定需要的類型庫

    一般是自己寫的軟件才方便修改。

  2. 在編譯參數中,配置庫環境變量,指定自定義庫所在位置

    編譯常用的手法

  3. 通過動態共享管理器,添加自定義庫地址

    通過系統層api統一管理

動態庫的管理與工具ldconfig

ldconfig生成並更新動態庫地址緩存文件,方便軟件調用。

同時可以通過 ldconfig動態共享管理器,查看當前系統能識別到的所有動態庫。

ldconfig -v

ldconfig的配置文件,在ld.so.conf,默認加載ld.so.conf.d文件夾下的所有配置文件。

只要在配置文件夾內,添加自定義軟件與地址即可,如:

# 創建獨立的配置文件
vim curl-x86_64.conf
# curl 自定義安裝地址
/opt/curl/lib
# 執行 ldconfig 更新共享裝載器緩存,並查看結果
ldconfig -v | egrep curl

當然也可以直接把動態庫,直接扔進系統動態庫裏,如:/lib,並通過ldconfig更新緩存,即可.

但是該操作有可能會引發其他不必要的麻煩,慎重

特別是更新軟件的時候,所以建議除非是自己開發的軟件,其他時候不要直接操作動態庫內的文件。

參考文獻

/etc/ld.so.conf詳解_流星 的技術博客_51CTO博客

Linux靜態、共享和動態庫之編程 - Daniel Han's Technical Notes (google.com)

Linux中的靜態庫與動態庫 - 獨孤劍—宇楓 - 博客園 (cnblogs.com)

linux下添加動態鏈接庫路徑、動態庫加載等方法 - ostin - 博客園 (cnblogs.com)

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