Linux 系統,也同樣面臨和Window一樣的問題,如何控制動態庫的多個版本問題。Window之前沒有處理好,為此專門有個名詞來形容這個問題 “Dll hell”,其嚴重影響軟件的升級和維護。 Dll hell 是指windows 上動態庫新版本覆蓋舊版本,但是卻不兼容老版本。常常發生在程序升級之后,動態庫更新,原有程序運行不起來;或者裝新軟件,但是已有的軟件運行不起來。 同樣Linux操作系統,也有同樣的問題,那么它是怎么解決的呢?
在金昌等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供網站設計制作、做網站 網站設計制作按需制作網站,公司網站建設,企業網站建設,品牌網站制作,營銷型網站,成都外貿網站制作,金昌網站建設費用合理。
Linux 為解決這個問題,引入了一套機制,如果遵守這個機制來做,就可以避免這個問題。 但是這只事一個約定,不是強制的。但是建議遵守這個約定,否則同樣也會出現 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號。主版本號,代表當前動態庫的版本,如果動態庫的接口有變化,那么這個版本號就要加1;后面的兩個版本號(小版本號 和 build 號)是告訴你詳細的信息,比如為一個hot-fix 而生成的一個版本,其小版本號加1,build號也應有變化。 這個文件名包含共享庫的代碼。
第二個是動態庫的soname( Short for shared object name),其是應用程序加載dll 時候,其尋找共享庫用的文件名。其格式為
lib + math+.so + ( major version number)
其只包含major version number,換句話說,也就是只要其接口沒有變,應用程序都可以用,不管你其后minor build version or build version。
問題來了,程序運行時怎么通過soname 找個real name? Soname 存在哪里?如果與real name 關聯起來?什么時候存的?
這就是接下來要介紹的第三個共享庫的名字,link name,顧名思義,就是在編譯過程,link 階段用的文件名。 其將sonmae 和real name 關聯起來。
第三個名字,共享庫的連接名(link name),是專門為build 階段連接而用的名字。這個名字就是lib + math +.so ,比如libmath.so。其是不帶任何版本信息的。在共享庫編譯過程中,連接(link) 階段,編譯器將生成一個共享庫及real name,同時將共享庫的soname,寫在共享庫文件里的文件頭里面。可以用命令 readelf -d sharelibrary 去查看。
靜態庫
可以把它想象成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為后綴的文件名,Windows下后綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、后綴:.a。
靜態庫優缺點
上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。
優點:1、在最后,函數庫是被打包到應用程序中的,實現函數本地化、尋址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。
缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對于用戶來說,會導致整個程序重新下載。
動態庫
在程序編譯時不會被連接到目標代碼中,在后期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件后綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、后綴:.so
動態庫優缺點
優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。
缺點:1、加載速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。
查看某個庫是否安裝命令:
為了讓動態鏈接庫為系統所共享,還需運行動態鏈接庫的管理命令 ldconfig 。此執行程序存放在/sbin目錄下。
ldconfig命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib .so ),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件。緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表。
ldconfig通常在系統啟動時運行,而當用戶安裝了一個新的動態鏈接庫時,就需要手工運行這個命令。
1、往/lib和/usr/lib里面加東西,是不用修改/etc/ld.so.conf文件的,但是添加完后需要調用下ldconfig,不然添加的library會找不到。
2、如果添加的library不在/lib和/usr/lib里面的話,就一定要修改/etc/ld.so.conf文件,往該文件追加library所在的路徑,然后也需要重新調用下ldconfig命令。比如在安裝MySQL的時候,其庫文件/usr/local/mysql/lib,就需要追加到/etc/ld.so.conf文件中。命令如下:
3、如果添加的library不在/lib或/usr/lib下,但是卻沒有權限操作寫/etc/ld.so.conf文件的話,這時就需要往export里寫一個全局變量LD_LIBRARY_PATH,就可以了。
參考:
1、 linux中ldconfig命令 以及 添加動態庫自動搜索路徑
2、 linux中ldconfig的使用介紹
3、 Linux 共享庫: LD_LIBRARY_PATH 與ld.so.conf
分享題目:linux安裝動態庫命令,linux使用動態庫
文章分享:http://vcdvsql.cn/article14/heocge.html
成都網站建設公司_創新互聯,為您提供網站營銷、網站導航、品牌網站建設、電子商務、App設計、小程序開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯