C語言中文網 目錄
首頁 > Linux入門 > Linux軟件安裝 閱讀:2,834

Linux函數庫(靜態函數庫和動態函數庫)及安裝過程

Linux 系統中存在大量的函數庫。簡單來講,函數庫就是一些函數的集合,每個函數都具有獨立的功能且能被外界調用。我們在編寫代碼時,有些功能根本不需要自己實現,直接調用函數庫中的函數即可。

需要注意的是,函數庫中的函數并不是以源代碼的形式存在的,而是經過編譯后生成的二進制文件,這些文件無法獨立運行,只有鏈接到我們編寫的程序中才可以運行。

Linux 系統中的函數庫分為 2 種,分別是靜態函數庫(簡稱靜態庫)和動態函數庫(也稱為共享函數庫,簡稱動態庫共享庫),兩者的主要區別在于,程序調用函數時,將函數整合到程序中的時機不同:
  • 靜態函數庫在程序編譯時就會整合到程序中,換句話說,程序運行前函數庫就已經被加載。這樣做的好處是程序運行時不再需要調用外部函數庫,可直接執行;缺點也很明顯,所有內容都整合到程序中,編譯文件會比較大,且一旦靜態函數庫改變,程序就需要重新編譯。
  • 動態函數庫在程序運行時才被加載(如圖 1 所示),程序中只保存對函數庫的指向(程序編譯僅對其做簡單的引用)。


    圖 1 函數庫調用

    使用動態函數庫的好處是,程序生成的可執行程序體積比較小,且升級函數庫時無需對整個程序重新編譯;缺點是,如果程序執行時函數庫出現問題,則程序將不能正確運行。

Linux 系統中,靜態函數庫文件擴展名是 ".a",文件通常命令為 libxxx.a(xxx 為文件名);動態函數庫擴展名為 ".so",文件通常命令為 libxxx.so.major.minor(xxx 為文件名,major 為主版本號,minor 為副版本號)。


目前,Linux 系統中大多數都是動態函數庫(主要考慮到軟件的升級方便),其中被系統程序調用的函數庫主要存放在 "/usr/lib" 和 "/lib" 中;Linux 內核所調用的函數庫主要存放在 "/lib/modules" 中。

注意,函數庫(尤其是動態函數庫)的存放位置非常重要,輕易不要做更改。

Linux 函數庫的安裝

Linux 發行版眾多,不同 Linux 版本安裝函數庫的方式不同。CentOS 中,安裝函數庫可直接使用 yum 命令。

例如,安裝 curses 函數庫命令如下:

[root@Linux ~]# yum install ncurses-devel


正常情況下,函數庫安裝完成后就可以直接被系統識別,但凡事都有萬一。這里先想一個問題,如何查看可執行程序調用了哪些函數庫呢?通過以下命令即可:

[root@localhost ~]# ldd -v 可執行文件名

-v 選項的含義是顯示詳細版本信息(不是必須使用)。

例如,查看 ls 命令調用了哪些函數庫,命令如下:

[root@localhost ~]# 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)

如果函數庫安裝后仍無法使用(運行程序時會提示找不到某個函數庫),這時就需要對函數庫的配置文件進行手動調整,也很簡單,只需進行如下操作:
  1. 將函數庫文件放入指定位置(通常放在 "/usr/lib" 或 "/lib" 中),然后把函數庫所在目錄寫入 "/etc/ld.so.conf" 文件。例如:

    [root@localhost ~]# cp *.so /usr/lib/
    #把函數庫復制到/usr/lib/目錄中
    [root@localhost ~]# vi /etc/ld.so.conf
    #修改函數庫配置文件
    include ld.so.conf.d/*.conf
    /usr/lib
    #寫入函數庫所在目錄(其實/usr/lib/目錄默認已經被識別)

    注意,這里寫入的是函數庫所在的目錄,而不單單是函數庫的文件名。另外,如果自己在其他目錄中創建了函數庫文件,這里也可以直接在 "/etc/ld.so.conf" 文件中寫入函數庫文件所在的完整目錄。
  2. 使用 ldconfig 命令重新讀取 /etc/ld.so.conf 文件,把新函數庫讀入緩存。命令如下:

    [root@localhost ~]# ldconfig
    #從/etc/ld.so.conf文件中把函數庫讀入緩存
    [root@localhost ~]# ldconfig -p
    #列出系統緩存中所有識別的函數庫

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo