首页
/
每日頭條
/
科技
/
libso文件
libso文件
更新时间:2026-05-02 23:32:30

說到這個LIB文件,先從一個小故障說起。

某日開發說,一台測試用虛機可以PING通SSH不能連了。運維同學就趕緊去查,SSHD_CONFIG配置文件都正确啊,一點錯誤都沒有,那為什麼呢?

測試下,不管連自己還是其他機,都是報錯

libso文件(lib文件的學習思考)1

這裡注意看,提示你有個libcom_err.so.2共享庫文件找不到。

詢問開發,才了解他們測試一個軟件,意外删除了某個庫文件。

那麼在正常的相同虛機的機器查看下,再和出錯的虛機比對下,發現少了2個庫文件

libso文件(lib文件的學習思考)2

挂載系統光盤或從正常的虛機上把這個兩個文件拷貝過來,放到lib64下就可以了

再試正常了

libso文件(lib文件的學習思考)3

這個小故障很容易解決,那麼你怎麼理解linux中的庫文件呢?學習下也不誤工作。

  • ◆library_name是libc.so(标準C庫);

  • ◆major_num是2(主版本号);

  • ◆minor_.min是0(次版本号);

  • ◆pathch_num是0(補丁級别号又稱發行号)。

  • 3、庫的操作命令

    Linux庫操作可以使用命令完成,目前常用的命令是ldd和ldconfig。

    ldd 是Library Dependency Display縮寫,它的作用是顯示一個可執行程序必須使用的共享庫 。

    (1)命令格式

    ldd [選項] 文件名

    (2)主要參數

    -d 執行重定位并報告丢失的函數。

    -r 執行對函數和數據對象的重定位,并報告丢失的函數和數據對象。

    (3)應用舉例

    比如查詢Perl語言有哪些共享庫,則可以首先使用find命令查詢這個程序的絕對路徑,然後使用ldd命令:

    #find -name perl

    ldd /usr/bin/perl

    $ ldd test

    執行test,可以看到它是如何調用動态庫中的函數的。

    2.ldconfig

    ldconfig 命令的作用是決定位于目錄/usr/lib和/lib下的共享庫所需的運行鍊接。這些鍊接保存在的Libs保存在/et/ld.so.conf文件中。搜 索出可共享的動态鍊接庫(格式如前介紹,lib*.so*),進而創建出動态裝入程序(ld.so)所需的鍊接和緩存文件。緩存文件默認為/etc /ld.so.cache,此文件保存已排好序的動态鍊接庫名字列表。

    (1)命令格式

    ldconfig [選項] [libs]

    (2)主要選項

    -v或--verbose ldconfig将顯示正在掃描的目錄、搜索到的動态鍊接庫,以及它所創建的連接的名字。

    -f CONF 指定動态鍊接庫的配置文件為CONF,系統默認為/etc/ld.so.conf。

    -C CACHE 指定生成的緩存文件為CACHE,系統默認的是/etc/ld.so.cache,文件存放已排好序的可共享的動态鍊接庫的列表。

    -p或--print-cache 讓ldconfig打印出當前緩存文件所保存的所有共享庫的名字。

    -r ROOT 改變應用程序的根目錄為ROOT。

    -n ldconfig僅掃描命令行指定的目錄,不掃描默認目錄(/lib、/usr/lib),也不掃描配置文件/etc/ld.so.conf所列的目錄。

    運行沒有選項的ldconfig命令時,用于更新高速緩沖文件。這個命令主要用于高速緩沖DNS服務器(Caching DNS Server)。高速緩沖DNS服務器的原理是提供查詢的曆史記錄,并且利用這些記錄來提高查詢的效率。

    當某個查詢是第一次被發送到高速緩沖DNS服務器時,高速緩沖DNS服務器就将此查詢的整個過程記錄下來,在一定的時期内用它來回答所有相同的查詢,從而減少整個DNS系統的負擔并且提高查詢速度。

    (3)應用實例

    如果用戶想知道系統中有哪些動态鍊接庫,或者想知道系統中有沒有某個動态鍊接庫時,可用-p選項讓ldconfig輸出緩存文件中的動态鍊接庫列表,從而查詢得到。 例如:

    ldconfig -p

    998 libs found in cache `/etc/ld.so.cache'

    libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2

    libzvt.so (libc6) => /usr/lib/libzvt.so

    ……

    補充:

    靜态鍊接庫*.a的編譯和使用

    創建.a庫文件和.o庫文件:

    [yufei@localhost perl_c2]$ pwd

    /home/yufei/perl_c2

    [yufei@localhost perl_c2]$ cat mylib.c

    #include <stdio.h>

    #include <string.h>

    void hello(){

    printf("success call from perl to c library\n");

    }

    [yufei@localhost perl_c2]$ cat mylib.h

    extern void hello();

    [yufei@localhost perl_c2]$ gcc -c mylib.c

    [yufei@localhost perl_c2]$ dir

    mylib.c mylib.h mylib.o

    [yufei@localhost perl_c2]$ ar -r mylib.a mylib.o

    ar: 正在創建 mylib.a

    [yufei@localhost perl_c2]$ dir

    mylib.a mylib.c mylib.h mylib.o

    *.a的使用方法

    最簡單的是直接把.a當成一個普通源代碼編譯進來.

    gcc main.cpp ./lib/libInfo.a -o exec

    動态鍊接庫*.so的編譯與使用- -

    動态庫*.so在linux下用c和c 編程時經常會碰到,這裡做個筆記,也為其它正為動态庫鍊接庫而苦惱的兄弟們提供一點幫助。

    1、動态庫的編譯

    下面通過一個例子來介紹如何生成一個動态庫。這裡有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們将這幾個文件編譯成一個動态庫:libtest.so。

    so_test.h:

    #include <stdio.h>

    #include <stdlib.h>

    void test_a();

    void test_b();

    void test_c();

    test_a.c:

    #include "so_test.h"

    void test_a()

    {

    printf("this is intest_a...\n");

    }

    test_b.c:

    #include "so_test.h"

    void test_b()

    {

    printf("this is intest_b...\n");

    }

    test_c.c:

    #include "so_test.h"

    void test_c()

    {

    printf("this is intest_c...\n");

    }

    将這幾個文件編譯成一個動态庫:libtest.so

    $ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

    2、動态庫的鍊接

    在1、中,我們已經成功生成了一個自己的動态鍊接庫libtest.so,下面我們通過一個程序來調用這個庫裡的函數。程序的源文件為:test.c。

    test.c:

    #include "so_test.h"

    int main()

    {

    test_a();

    test_b();

    test_c();

    return 0;

    }

    l 将test.c與動态庫libtest.so鍊接生成執行文件test:

    $ gcc test.c -L. -l test -o test

    l 測試是否動态連接,如果列出libtest.so,那麼應該是連接正常了

    $ ldd test

    l 執行test,可以看到它是如何調用動态庫中的函數的。

    總結:

    1、共享庫特别适合多個程序共享代碼,升級程序部分功能模塊,實現程序“插件”功能的情況;

    而靜态庫是一勞永逸,編譯後不需要帶一堆庫文件跑,而且不管放置到哪裡都可正常運行。

    2、當搜索的庫文件目錄下同時存在該庫的靜态版本和共享版本時,鍊接器優先使用共享版本.so,此時你可以使用-static鍊接選項指定鍊接靜态版本.a。

    3、動态庫可以導出兩個特殊的函數:_init和_fini,前者在動态庫被加載後調用,後者在動态庫被卸載前調用,

    我們可以使用這兩個函數做些特别的工作。需要注意的是:在定義這兩個函數後編譯時,需要使用

    -nostartfiles選項,否則編譯器報重複定義錯誤。

    4、ldd命令用來查看程序所依賴的共享庫,同時也方便我們判斷共享庫是否被找到;

    nm命令查看obj文件(.so也是一個obj)中的标識(函數、變量)。

    ,
    Comments
    Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
    Sign up to post
    Sort by
    Show More Comments
    推荐阅读
    異地購車注意的詳盡的流程
    異地購車注意的詳盡的流程
    1、首先先去當地4S店看車,選好車型,然後問優惠力度,掌握當地的情況以後再給異地的4S店打電話,問優惠,當然要把細節問的很清楚,合格證也問好啊,幾天給合格證,把能想到的都羅列出來寫到購車合同裡去。2、購車發票就是您購車的重要憑證,上面記載着購車人情況、車輛售價以及車輛VIN碼等重要信息,您在為車上牌的時候它有很重要的作用。所以在購車時您務必向經銷商索要購車發票,并要确認其有效性。此外,購車發票還有
    2026-05-02
    和諧福是什麼
    和諧福是什麼
    以華為P40、EMUI11、支付寶10.2.15為例。和諧福是支付寶“五福紅包”活動中的“福”字之一。其他四福為富強福、友善福、愛國福和敬業福。2020年支付寶集五福活動時間為2020年1月13日(臘月十九)-2020年1月24日(除夕)。支付寶(Alipay)是一款第三方支付平台,其最初為阿裡巴巴集團旗下網站淘寶網的一個部門,2004年12月8日正
    2026-05-02
    OPPO手機密碼忘了該怎麼辦
    OPPO手機密碼忘了該怎麼辦
    1、方法一。可以在手機上找回,也就是進入【桌面】—【雲服務】—【找回手機】,打開開關。其次,是用手機或電腦,登錄雲服務網頁輸入賬戶密碼。第二,是點擊【找回手機】,選擇【設備】,也就是選擇手機機型。待設備旁邊的燈”亮後,點擊【鎖定屏幕】,重新設置密碼。最後,設置密碼成功後,手機啟用的就是剛設置的密碼了。這就相當于重新設置了密碼。2、方法二。是通過雲服務重新設置密碼。不過這種方法需要确保注冊有oppo
    2026-05-02
    如何取消文檔保護密碼
    如何取消文檔保護密碼
    演示機型:華為MateBookX系統版本:win10APP版本:word20161、雙擊需要取消加密的Word文檔,打開該文檔。2、在彈出的密碼輸入框中輸入加密文檔的密碼,點擊确定進入該文檔界面。3、點擊文檔上方工具欄中的安全選項,進入安全設置頁面。4、在菜單欄中選擇文檔加密選項,進入密碼設置界面。5、選擇彈出對話框左側的密碼加密選項,進入密碼設置界面。6、在密碼設置界面将打開權限下方的三個對話框
    2026-05-02
    蘋果電腦黑屏了怎麼辦
    蘋果電腦黑屏了怎麼辦
    1、原因:可能是内存問題。解決方案:在啟動電腦後,對内存和其它部件進行檢測是否能正常工作,若不能,系統則會用喇叭報警,喇叭聲音不同,則故障不同。比如:喇叭發出嘀嘀”聲,顯示器黑屏,則說明是内存故障,因此,要打開機箱,拔下内存,仔細察看檢修或換一條新的内存條插上,這樣電腦就能恢複正常了。2、原因:可能是顯卡問題;解決方案:若電腦開機後,系統自檢正常,但小喇叭不報警,屏幕上會顯示NoSignals”,
    2026-05-02
    Copyright 2023-2026 - www.tftnews.com All Rights Reserved