1. 程式人生 > >Linux 函式庫

Linux 函式庫

函式庫其實就是函式,只不過是系統所呼叫的函式。這樣說吧,我寫了一個軟體,所有的功能都需要我自己完成嗎?其實是不需要的,因為很多功能是別人已經寫好的,我只需要拿來用就好了。這些有獨立功能並且可以被其他程式呼叫的程式是函式。

函式庫分類

當其他程式呼叫函式時,根據是否把函式直接整合到程式中而分為靜態函式和動態函式。我們分別看看這兩種函式的優缺點。

靜態函式庫

函式庫檔案一般以"*.a"副檔名結尾,這種函式庫在被程式呼叫時會被直接整合到程式當中。

優點:程式執行時,不需要在呼叫外部資料,可以直接執行。

缺點:因為把所有內容都整合到程式中,所以編譯檔案會比較大,升級比較困難,需要把整個程式重新編譯。

動態函式庫

函式庫檔案通常以"*.so"副檔名結尾,這種函式庫在被程式呼叫時,並沒有直接整合到程式當中,當程式需要用到函式庫的功能時,再去讀取函式庫,在程式中只儲存了函式庫的指向,如圖 1 所示。



圖 1 函式庫呼叫


優點:因為沒有把整個函式庫整合到程式中,所以檔案較小,升級方便,不需要把整個程式重新編譯,只需要重新編譯安裝函式庫就好。

缺點:程式在執行時需要呼叫外部函式,如果這時函數出現問題,或指向位置不正確,那麼程式將不能正確執行。

目前 Linux 中的大多數函式庫是動態函式庫,主要是因為升級方便;但是函式的存放位置非常重要,而且不能更改。目前被系統程式呼叫的函式主要存放在"/usr/lib"和"/lib"中,而 Linux 核心所呼叫的函式庫主要存放在"/lib/modules"中。

安裝函式庫

那麼,系統中的可執行程式到底呼叫了哪些函式庫呢?可以査詢到嗎?當然可以,命令如下:

[[email protected] ~]# ldd -v 可執行檔名

選項:

  • -v: 顯示詳細版本資訊


比如,査看一下 ls 命令呼叫了哪些函式庫,命令如下:

[[email protected] ~]# ldd /bin/ls
linux-gate.so.1 => (0x00d56000)
libselinux.so.1 =>/lib/libselinux.so.1 (0x00cc8000)
librt.so.1 =>/lib/librt.so.1 (0x00cb8000)
libcap.so.2 => /lib/libcap.so.2 (0x00160000)
libacl.so.1 => /lib/libacl.so.1 (0x00140000)
libc.so.6 => /lib/libc.so.6 (0x00ab8000)
libdl.so.2 => /lib/libdl.so.2 (0x00ab0000)
/lib/ld-linux.so.2 (0x00a88000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00c50000)
libattr.so.1 =>/lib/libattr.so.1 (0x00158000)


新安裝了一個函式庫,如何讓它被系統識別?其實軟體如果是正常安裝的,則是不需要手工調整函式庫的。但是萬一沒有安裝正確,需要手工安裝呢?那也很簡單,只要把函式庫放入指定位置,一般放在"/usr/lib"或"/lib"中,然後把函式庫所在目錄寫入"/etc/ld.so.conf"檔案中。注意是寫入函式庫所在目錄,而不是寫入函式庫的檔名。比如:

[[email protected] ~]# cp *.so /usr/lib/
#把函式庫複製到/usr/lib/目錄中
[[email protected] ~]# vi /etc/ld.so.conf
#修改函式庫配置檔案
include ld.so.conf.d/*.conf
/usr/lib
#寫入函式庫所在目錄(其實/usr/lib/目錄預設已經被識別)

接著使用 ldconfig 命令重新讀取 /etc/ld.so.conf 檔案,把新函式庫讀入快取即可。命令如下:

[[email protected] ~]# ldconfig
#從/etc/ld.so.conf檔案中把函式庫讀入快取
[[email protected] ~]# ldconfig -p
#列出系統快取中所有識別的函式庫