真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux動(dòng)態(tài)庫連接命令 linux建立動(dòng)態(tài)庫連接

linux 編譯怎么連接動(dòng)態(tài)庫

Linux的動(dòng)態(tài)庫文件是以lib字樣開頭的.so文件,編譯鏈接動(dòng)態(tài)庫有兩個(gè)要點(diǎn):一個(gè)是需要用-L選項(xiàng)指定動(dòng)態(tài)庫的搜索路徑,這個(gè)搜索路徑是需要連接的so文件的大致路徑,比如/usr/openssl/lib;另外還需要用-l(這個(gè)是小寫的L)選項(xiàng)指定動(dòng)態(tài)庫的名字,比如下面這條編譯命令:

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、昂仁網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、昂仁網(wǎng)絡(luò)營銷、昂仁企業(yè)策劃、昂仁品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供昂仁建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

gcc -o hello hello.c -L/usr/openssl/lib -lcrypto

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

靜態(tài)庫

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

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

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

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

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

動(dòng)態(tài)庫

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

動(dòng)態(tài)庫優(yōu)缺點(diǎn)

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

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

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

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

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

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

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

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

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

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

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

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

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

面試 | Linux 下的動(dòng)態(tài)鏈接庫問題

在 Linux 開發(fā)時(shí),我們經(jīng)常會(huì)看到一些形如 xxx.so 的名稱出現(xiàn),其中 so 是 Shared Object 的縮寫,即可以共享的目標(biāo)文件,也就是我們所稱為的動(dòng)態(tài)鏈接庫,和在 Windows 下大家玩 游戲 時(shí)遇到的 xxx.dll 錯(cuò)誤中的文件是一個(gè)類型的。

面試中經(jīng)常會(huì)問到以下問題:

庫是寫好的現(xiàn)有的,成熟的,可以復(fù)用的代碼?,F(xiàn)實(shí)中每個(gè)程序都要依賴很多基礎(chǔ)的底層庫,不可能每個(gè)人的代碼都從零開始,因此庫的存在意義非同尋常。本質(zhì)上來說庫是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。

庫有兩種:

在一個(gè)程序的編譯過程中,分為以下幾個(gè)步驟: 預(yù)處理 , 編譯 , 匯編 , 鏈接 。本文中討論的鏈接庫就是針對最后一個(gè)步驟「鏈接」而言的。

動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別

左圖為靜態(tài)鏈接庫,右圖為動(dòng)態(tài)鏈接庫

對于靜態(tài)鏈接庫而言在鏈接階段,會(huì)將匯編生成的「目標(biāo)文件.o」與引用到的庫一起鏈接打包到可執(zhí)行文件中。因此對應(yīng)的鏈接方式稱為靜態(tài)鏈接:

靜態(tài)鏈接可以理解為最后生成了一個(gè)「單文件免安裝綠色版」的程序,優(yōu)點(diǎn)在于移植的時(shí)候只需要移動(dòng)這一個(gè)文件,缺點(diǎn)在于文件體積非常大,為了解決這樣的問題,就有了動(dòng)態(tài)鏈接庫。動(dòng)態(tài)鏈接庫在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入。

動(dòng)態(tài)庫連接到系統(tǒng)空間,如果多個(gè)程序連接了同一個(gè)庫,那么只需要一份,優(yōu)點(diǎn)在于編譯程序的時(shí)候不會(huì)將對應(yīng)的庫文件全部打包在生成的程序中,而是保留了到對應(yīng)庫的鏈接,缺點(diǎn)就是移植的時(shí)候如果只移動(dòng)了對應(yīng)的程序沒有安裝相關(guān)的庫的話,就會(huì)看到類似以下喜聞樂見的結(jié)果了。

在 Linux 下一個(gè)動(dòng)態(tài)庫有y三個(gè)不同名字的文件組成:

當(dāng)程序在內(nèi)部列出所需要的鏈接庫時(shí),僅僅使用 soname。當(dāng)你創(chuàng)建一個(gè)鏈接庫時(shí),使用 real name。安裝一個(gè)新的鏈接庫時(shí),把它復(fù)制到一個(gè)DLL文件夾里,然后運(yùn)行程序 ldconfig。ldconfig 檢查存在的 real name 文件,并且創(chuàng)建指向它符號(hào)鏈接 soname 文件??赡艽蠹冶容^常見到的有 libsodium 等。

有了上面關(guān)于庫的一些基礎(chǔ)知識(shí)之后,我們可以開始嘗試創(chuàng)建一個(gè)動(dòng)態(tài)庫來供程序使用了。

比如我們有一個(gè)求最大值的函數(shù) max(int a,int b,int c) ,放在文件 max.c 中文件內(nèi)容如下:

可以通過:

將其編譯為共享庫,-fPIC是編譯選項(xiàng),PIC是 Position Independent Code 的縮寫,表示要生成位置無關(guān)的代碼,這是動(dòng)態(tài)庫需要的特性; -shared是鏈接選項(xiàng),告訴 gcc 生成動(dòng)態(tài)庫而不是可執(zhí)行文件。為了讓用戶知道我們的動(dòng)態(tài)庫中有哪些接口可用,我們需要編寫對應(yīng)的頭文件,比如可以寫一個(gè) max.h :

設(shè)置一個(gè)驅(qū)動(dòng)函數(shù)來測試我們編寫的動(dòng)態(tài)庫:

通過 gcc test.c -L. -lmax來生成 a.out,其中-lmax表示要鏈接 libmax.so,-L.表示搜索要鏈接的庫文件時(shí)包含當(dāng)前路徑。

但是這樣直接運(yùn)行的話,會(huì)出現(xiàn)一個(gè)錯(cuò)誤:

由于 Linux 是通過/etc/ld.so.cache文件搜尋要鏈接的動(dòng)態(tài)庫的,而 /etc/ld.so.cache 是 ldconfig 程序讀取 /etc/ld.so.conf 文件生成的,本次使用的動(dòng)態(tài)庫 libmax.so 并不在對應(yīng)的目錄下,就會(huì)導(dǎo)致程序無法找到對應(yīng)的動(dòng)態(tài)鏈接庫,這樣我們的解決方法有二:

小結(jié)

動(dòng)態(tài)鏈接庫是各個(gè)系統(tǒng)中的一個(gè)重要的組成部分且在 Linux 開發(fā)相關(guān)領(lǐng)域中尤為重要,也是一個(gè)面試的高頻考點(diǎn),除了動(dòng)態(tài)鏈接庫以外,還有以下相關(guān)知識(shí)也是高頻考點(diǎn),在面試前一定要準(zhǔn)備好:

本文作者:Nova Kwok


網(wǎng)站標(biāo)題:linux動(dòng)態(tài)庫連接命令 linux建立動(dòng)態(tài)庫連接
標(biāo)題鏈接:http://weahome.cn/article/ddsihjp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部