成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Linux動態(tài)庫命令 linux 靜態(tài)庫 動態(tài)庫

Linux下的靜態(tài)庫和動態(tài)庫

靜態(tài)庫

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供頭屯河企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為頭屯河眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

可以把它想象成是一些代碼的集合,在可執(zhí)行程序運行前就已經(jīng)加到了代碼中,成為了執(zhí)行程序的一部分,一般是以.a為后綴的文件名,Windows下后綴為.lib。靜態(tài)庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、后綴:.a。

靜態(tài)庫優(yōu)缺點

上面簡單介紹了靜態(tài)庫,那它自然也會有優(yōu)缺點,這里來介紹下它的優(yōu)缺點。

優(yōu)點:1、在最后,函數(shù)庫是被打包到應(yīng)用程序中的,實現(xiàn)函數(shù)本地化、尋址方便、高效。2、程序在運行的時候,與函數(shù)庫沒有關(guān)系,移植性更強。

缺點:1、消耗資源較大,每個進程在使用靜態(tài)庫的時候,都要復(fù)制一份才可以,這也就造成了內(nèi)存的消耗。2、在程序更新、部署、發(fā)布的時候,使用靜態(tài)庫相對麻煩,如果一個靜態(tài)庫更新了,那它的應(yīng)用程序都需要重新編譯,再發(fā)送給用戶,有的時候可能只是一個小的改動,但對于用戶來說,會導(dǎo)致整個程序重新下載。

動態(tài)庫

在程序編譯時不會被連接到目標(biāo)代碼中,在后期運行時才會載入,不同的應(yīng)用程序如果調(diào)用相同的庫,內(nèi)存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件后綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、后綴:.so

動態(tài)庫優(yōu)缺點

優(yōu)點:1、節(jié)省內(nèi)存2、部署、升級相對方便,只需要更換動態(tài)庫,再重新啟動服務(wù)即可。

缺點:1、加載速度比靜態(tài)庫慢2、移植性較差,需要把所有用到的動態(tài)庫進行移植。

linux一個應(yīng)用多個版本動態(tài)庫命令

Linux 系統(tǒng),也同樣面臨和Window一樣的問題,如何控制動態(tài)庫的多個版本問題。Window之前沒有處理好,為此專門有個名詞來形容這個問題 “Dll hell”,其嚴(yán)重影響軟件的升級和維護。 Dll hell 是指windows 上動態(tài)庫新版本覆蓋舊版本,但是卻不兼容老版本。常常發(fā)生在程序升級之后,動態(tài)庫更新,原有程序運行不起來;或者裝新軟件,但是已有的軟件運行不起來。 同樣Linux操作系統(tǒng),也有同樣的問題,那么它是怎么解決的呢?

Linux 為解決這個問題,引入了一套機制,如果遵守這個機制來做,就可以避免這個問題。 但是這只事一個約定,不是強制的。但是建議遵守這個約定,否則同樣也會出現(xiàn) Linux 版的Dll hell 問題。 下面來介紹一個這個機制。 這個機制是通過文件名,來控制dll (shared library) 的版本。

Linux 上的Dll ,叫shared library,其有三個名字,分別有不同的目的。

第一個是共享庫本身的文件名(real name),其通常包含版本號,常常是是這樣: libmath.so.1.1.1234 。 lib是Linux 上的庫的約定前綴,math 是共享庫名字,so 是共享庫的后綴名,1.1.1234的是共享庫的版本號,其主版本號+小版本號+build號。主版本號,代表當(dāng)前動態(tài)庫的版本,如果動態(tài)庫的接口有變化,那么這個版本號就要加1;后面的兩個版本號(小版本號 和 build 號)是告訴你詳細(xì)的信息,比如為一個hot-fix 而生成的一個版本,其小版本號加1,build號也應(yīng)有變化。 這個文件名包含共享庫的代碼。

第二個是動態(tài)庫的soname( Short for shared object name),其是應(yīng)用程序加載dll 時候,其尋找共享庫用的文件名。其格式為

lib + math+.so + ( major version number)

其只包含major version number,換句話說,也就是只要其接口沒有變,應(yīng)用程序都可以用,不管你其后minor build version or build version。

問題來了,程序運行時怎么通過soname 找個real name? Soname 存在哪里?如果與real name 關(guān)聯(lián)起來?什么時候存的?

這就是接下來要介紹的第三個共享庫的名字,link name,顧名思義,就是在編譯過程,link 階段用的文件名。 其將sonmae 和real name 關(guān)聯(lián)起來。

第三個名字,共享庫的連接名(link name),是專門為build 階段連接而用的名字。這個名字就是lib + math +.so ,比如libmath.so。其是不帶任何版本信息的。在共享庫編譯過程中,連接(link) 階段,編譯器將生成一個共享庫及real name,同時將共享庫的soname,寫在共享庫文件里的文件頭里面??梢杂妹?readelf -d sharelibrary 去查看。

linux動態(tài)庫可以找到函數(shù)找不到類

1. 動態(tài)鏈接庫簡介

動態(tài)庫又叫動態(tài)鏈接庫,是程序運行的時候加載的庫,當(dāng)動態(tài)鏈接庫正確安裝后,所有的程序都可以使用動態(tài)庫來運行程序。動態(tài)庫是目標(biāo)文件的集合,目標(biāo)文件在動態(tài)庫中的組織方式是按特殊的方式組織形成的。在動態(tài)庫中函數(shù)和變量的地址是相對地址而不是絕對地址,其真實地址在調(diào)用動態(tài)庫的程序加載時形成的。

動態(tài)庫的名字有別名(soname), 真名(realname)和鏈接名(linkername)。別名是由一個lib前綴,然后是庫的名字,最后以“.so”結(jié)尾來構(gòu)成。真名是動態(tài)鏈接庫的真實名字,一般總是在別名的基礎(chǔ)上添加一個版本號信息。除此之外還有一個鏈接名,他是在程序鏈接的時候使用的名字。

動態(tài)庫安裝的時候,總是復(fù)制庫文件到某一個目錄,然后使用一個軟鏈接生成一個別名,在庫文件更新的時候,僅僅更新軟鏈接即可。

2. 生成動態(tài)鏈接庫

生成動態(tài)鏈接庫的命令比較簡單:

2.1 使用-shared 告訴編譯器生成一個動態(tài)鏈接庫

2.2 使用選項-fPIC或者-fpic,使得生成的代碼與位置無關(guān)

gcc -shared -Wl, -soname, libstr.so -o libstr.so.1 string.c

復(fù)制

其中,“-shared” 表示要生成的為動態(tài)鏈接庫文件;

“-soname, libstr.so” 表示生成的動態(tài)鏈接庫的別名為“l(fā)ibstr.so”;

“-o libstr.so” 表示生成名字為“l(fā)ibstr.so.1”的實際動態(tài)鏈接庫文件;

2.3 動態(tài)鏈接庫的安裝

生成動態(tài)鏈接庫后,一個很重要的操作是安裝,一般情況下,我們將庫文件放到系統(tǒng)默認(rèn)的搜索路徑下,常用的有/lib, /usr/lib, /usr/local/lib 。將 動態(tài)鏈接庫放到這三個中任意個目錄都可以。

3. 動態(tài)鏈接庫的配置文件

一般情況下,動態(tài)鏈接庫不能隨意使用。如果要在運行的程序中使用動態(tài)鏈接庫,需要制定系統(tǒng)的動態(tài)鏈接庫搜索路徑,只有讓系統(tǒng)能找到運行時需要的動態(tài)鏈接庫才能使用它。 系統(tǒng)中的配置文件/etc/ld.so.conf便是動態(tài)鏈接庫的搜索路徑配置文件。在這個文件內(nèi)存放著可以被Linux共享的動態(tài)鏈接庫所在目錄的名字(系統(tǒng)默認(rèn)的/lib, /usr/lib除外)。 多個目錄之間可以使用空格,換行符進行隔開。

本文標(biāo)題:Linux動態(tài)庫命令 linux 靜態(tài)庫 動態(tài)庫
網(wǎng)頁網(wǎng)址:http://jinyejixie.com/article32/hehopc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈企業(yè)網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司
锦州市| 赫章县| 额敏县| 南充市| 云和县| 汕尾市| 贵阳市| 荃湾区| 定西市| 始兴县| 南召县| 沧州市| 临夏市| 黑龙江省| 资溪县| 高淳县| 陕西省| 年辖:市辖区| 江源县| 宣威市| 两当县| 鄂伦春自治旗| 手游| 滨州市| 彝良县| 张家川| 杭州市| 海城市| 牙克石市| 镇平县| 仪陇县| 北海市| 玉山县| 徐州市| 临夏县| 夹江县| 峡江县| 兴隆县| 丹棱县| 额济纳旗| 沿河|