<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • linux動態(tài)庫連接命令 linux建立動態(tài)庫連接

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

            Linux的動態(tài)庫文件是以lib字樣開頭的.so文件,編譯鏈接動態(tài)庫有兩個要點:一個是需要用-L選項指定動態(tài)庫的搜索路徑,這個搜索路徑是需要連接的so文件的大致路徑,比如/usr/openssl/lib;另外還需要用-l(這個是小寫的L)選項指定動態(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è)計、昂仁網(wǎng)絡(luò)營銷、昂仁企業(yè)策劃、昂仁品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供昂仁建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.jbt999.com

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

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

            靜態(tài)庫

            可以把它想象成是一些代碼的集合,在可執(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)庫

            在程序編譯時不會被連接到目標代碼中,在后期運行時才會載入,不同的應(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”,其嚴重影響軟件的升級和維護。 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號。主版本號,代表當前動態(tài)庫的版本,如果動態(tài)庫的接口有變化,那么這個版本號就要加1;后面的兩個版本號(小版本號 和 build 號)是告訴你詳細的信息,比如為一個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)鏈接庫問題

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

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

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

            庫有兩種:

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

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

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

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

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

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

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

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

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

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

            可以通過:

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

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

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

            但是這樣直接運行的話,會出現(xiàn)一個錯誤:

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

            小結(jié)

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

            本文作者:Nova Kwok

            網(wǎng)頁題目:linux動態(tài)庫連接命令 linux建立動態(tài)庫連接
            網(wǎng)站路徑:http://www.jbt999.com/article28/ddsihjp.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站制作App設(shè)計、手機網(wǎng)站建設(shè)品牌網(wǎng)站制作、網(wǎng)站收錄

            廣告

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

            手機網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 久草影音先锋 | 成人毛片18女人免费视频 | 午夜神马福利 | 黄色视频免费 | 中文字幕乱伦网站 |