亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux下的lib文件的學習思考是什么

發布時間:2021-10-21 17:47:07 來源:億速云 閱讀:170 作者:柒染 欄目:云計算

今天就跟大家聊聊有關linux下的lib文件的學習思考是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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

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

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

linux下的lib文件的學習思考是什么

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

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

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

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

再試正常了

linux下的lib文件的學習思考是什么

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

Linux下的庫文件分為共享庫和靜態庫兩大類,它們兩者的差別僅在程序執行時所需的代碼是在運行時動態加載的,還是在編譯時靜態加載的。 

Linux的庫一般在/lib 或/usr/lib 目 錄下,如果是64位的系統則會有lib64目錄。lib是庫(Library)的英文縮寫,它主要存放系統的鏈接庫文件,沒有該目錄則系統就無法正常運行。/lib目錄中存儲著程序運行時使用的共享庫。通過共享庫,許多程序可以重復使用相同的代碼,并且這些庫可以存儲在一個公共的位置上,因此能減小運行程序的大小。這個目錄包含程序在鏈接時使用的 各種庫。

庫的知識

1.庫的命名


庫的命名比較簡單,第一個特點是所有的庫以lib開頭,GCC命令在在-l選項所指定的文件名前會自動加入lib。

第二個特點文件名以.a結尾的庫是靜態庫。

第三個特點文件名是.so的庫為共享庫(共享庫是在運行的時候動態加載的 )。默認情況下,GCC在鏈接時優先使用共享庫,只有當共享庫不存在時才考慮使用靜態庫。 

2、庫的編號

庫的編號格式如下: 

library_name .major.num .minor_.min .pathch_num 
例如,筆者Red Hat Linux 9.0的GUN數據庫是libgdbm.so.0.0.2,詳細表述如下:

◆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)中的標識(函數、變量)。

看完上述內容,你們對linux下的lib文件的學習思考是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇平县| 苗栗县| 娱乐| 营口市| 北海市| 彭州市| 贵阳市| 应城市| 丽水市| 金秀| 无为县| 甘孜| 金乡县| 阿尔山市| 大理市| 平阳县| 轮台县| 海阳市| 贵南县| 榆树市| 滨海县| 文昌市| 万源市| 德昌县| 年辖:市辖区| 阳曲县| 启东市| 浙江省| 齐齐哈尔市| 菏泽市| 奉化市| 甘孜| 雷波县| 宜昌市| 沙洋县| 沭阳县| 镇巴县| 巢湖市| 民丰县| 萍乡市| 弥渡县|