新聞中心
在Linux操作系統(tǒng)上,動態(tài)鏈接庫是非常重要的一部分。它們?yōu)閼?yīng)用程序提供了一種共享代碼的方式,減少了內(nèi)存使用和增加了系統(tǒng)的安全性。然而,動態(tài)鏈接庫也會帶來一些依賴問題,在本文中,我們將深入探討這些問題。

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、潁泉網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為潁泉等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
一、動態(tài)鏈接庫的基礎(chǔ)知識
1.1 靜態(tài)鏈接庫和動態(tài)鏈接庫
在編譯應(yīng)用程序時,有兩種方式可以將代碼與所依賴的庫鏈接起來:靜態(tài)鏈接和動態(tài)鏈接。靜態(tài)鏈接庫將所有依賴的庫的代碼復(fù)制到應(yīng)用程序中,生成一個獨立的可執(zhí)行文件。而動態(tài)鏈接庫則將依賴的庫的代碼放在一個單獨的文件中,并在運行時加載到內(nèi)存中。
1.2 動態(tài)鏈接庫的優(yōu)勢
動態(tài)鏈接庫相對于靜態(tài)鏈接庫有以下幾個優(yōu)勢:
– 內(nèi)存使用更加高效。靜態(tài)鏈接庫會導(dǎo)致應(yīng)用程序內(nèi)存使用更多,而動態(tài)鏈接庫只需要將所需要的代碼加載到內(nèi)存中即可。
– 代碼更新更加方便。如果一個應(yīng)用程序依賴的庫需要更新,對于靜態(tài)鏈接庫,需要重新編譯整個應(yīng)用程序;而對于動態(tài)鏈接庫,只需要將新的庫替換原來的庫即可。
– 提高系統(tǒng)的安全性。靜態(tài)鏈接庫可能會包含某些安全漏洞,而動態(tài)鏈接庫只需要更新單獨的庫即可修復(fù)漏洞。
二、Linux動態(tài)鏈接庫依賴問題
動態(tài)鏈接庫帶來了很多優(yōu)點,但也帶來了一些挑戰(zhàn)。其中最明顯的問題就是動態(tài)鏈接庫依賴問題。假設(shè)應(yīng)用程序A使用了動態(tài)鏈接庫B,并且B也依賴了動態(tài)鏈接庫C,那么在運行時,A需要正確地找到和加載B和C。如果找不到依賴的庫,應(yīng)用程序?qū)o法運行。下面將介紹幾個可能出現(xiàn)的問題。
2.1 依賴庫路徑問題
當應(yīng)用程序需要一個動態(tài)鏈接庫時,它會去系統(tǒng)預(yù)定的搜索路徑中尋找依賴的庫,如/lib, /usr/lib 或/usr/local/lib。如果依賴的庫不在這些路徑中,則應(yīng)用程序無法找到它。
解決這個問題的方法有以下幾種:
– 將庫復(fù)制到搜索路徑中。如果庫不在搜索路徑中,則可以使用cp命令將其復(fù)制到相應(yīng)的路徑。
– 在運行程序時指定依賴庫的路徑。可以使用LD_LIBRARY_PATH環(huán)境變量或者使用ldd命令查看依賴的庫路徑,并用export命令設(shè)置該環(huán)境變量。
– 在運行程序時指定依賴庫的位置??梢栽诰幾g應(yīng)用程序時使用-l選項指定庫的位置。
2.2 依賴庫版本問題
動態(tài)鏈接庫可以有不同的版本,不同的版本可能并不兼容。例如,當應(yīng)用程序需要版本為1.0的動態(tài)鏈接庫A時,但系統(tǒng)上只存在1.1版本的庫A,那么在運行時就會出現(xiàn)版本不兼容的問題。
解決這個問題可以通過以下幾種方式:
– 在編譯應(yīng)用程序時,使用-l選項指定需要的庫的版本。
– 在運行程序時,使用LD_LIBRARY_VERSION環(huán)境變量來指定依賴庫的版本。
– 在運行程序時,指定依賴庫的路徑及版本號。
2.3 依賴庫的缺失和錯誤
如果應(yīng)用程序依賴的庫缺失或出現(xiàn)錯誤,應(yīng)用程序?qū)o法正常運行。解決這個問題需要確保依賴的庫存在,并且沒有錯誤。
對于缺失的庫,可以使用以下幾種方法:
– 安裝缺失的庫。可以使用包管理工具安裝缺失的庫。
– 在運行程序時指定依賴庫的路徑,如使用LD_LIBRARY_PATH環(huán)境變量。
對于庫出現(xiàn)錯誤的情況,比如庫損壞、病毒感染等,需要對庫進行修復(fù)或者重新安裝。
三、
動態(tài)鏈接庫是Linux系統(tǒng)中非常關(guān)鍵的一部分,它可以提高系統(tǒng)內(nèi)存使用效率,簡化代碼更新和維護,提高系統(tǒng)的安全性。但動態(tài)鏈接庫也會帶來一些挑戰(zhàn),最明顯的問題是依賴問題。為了解決這個問題,需要正確設(shè)置搜索路徑、版本號和確保依賴的庫存在和沒有錯誤。理解和解決依賴問題對于Linux軟件開發(fā)和系統(tǒng)維護都是非常重要的。
相關(guān)問題拓展閱讀:
- SUSE Linux 11下glibc依賴問題
- 怎么解決安裝linux軟件的依賴問題
- Linux下程序運行依賴庫如何指定?
SUSE Linux 11下glibc依賴問題
0.以下在系統(tǒng)CentOS 6.3 x86_64上操作
1.試圖運行程序,提示”libc.so.6: version `GLIBC_2.14′ not found”,原因是系統(tǒng)的glibc版本太低,軟件編譯時使用了較高版本的glibc引起的:
view plain copy
$ pwd
/var/VMdisks/cross/mingw32/bin
$ ls
lrelease QtCore4.dllQtNetwork4.dll QtSql4.dll QtXml4.dll
mocQtDeclarative4.dll QtOpenGL4.dllQtSvg4.dll rcc
phonon4.dll QtGui4.dllQtScript4.dllQtTest4.dll uic
qmakeQtMultimedia4.dll QtScriptTools4.dll QtWebKit4.dll
$ ./qmake
./qmake: /lib64/libc.so.6: version `GLIBC_2.14′ not found (required by ./qmake)
2.查看系統(tǒng)glibc支持的版本:
view plain copy
$ strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE
view plain copy
$ rpm -qa |grep glibc
glibc-static-2.12-1.80.el6_3.6.x86_64
glibc-headers-2.12-1.80.el6_3.6.x86_64
glibc-common-2.12-1.80.el6_3.6.x86_64
glibc-devel-2.12-1.80.el6_3.6.x86_64
glibc-static-2.12-1.80.el6_3.6.i686
glibc-devel-2.12-1.80.el6_3.6.i686
glibc-2.12-1.80.el6_3.6.i686
glibc-2.12-1.80.el6_3.6.x86_64
3.可以看到更高只支持2.12版本,所以考慮編譯解決這個問題:
a. 到下載最新版本,我這里下載了glibc-2.14.tar.xz 猛陸這個版本,解壓到任意目錄準備編譯
b.這里解壓到/var/VMdisks/glibc-2.14/
view plain copy
$ cd /var/VMdisks/glibc-2.14/
$ pwd
/var/VMdisks/glibc-2.14
$ ls
abilistconfig.h.inintlREADME.libm
abi-tagsconfig.logio 橋知則resolv
aclocal.mconfig.make.inlibc-abis resource
aout configurelibidnrt
argp configure.inlibioRules
assert敏棚 conform LICENSESscripts
autom4te.cache CONFORMANCElocalesetjmp
bits COPYING localedata shadow
BUGS COPYING.LIBloginshlib-versions
buildcppflags-iterator.mk machsignal
CANCEL-FCT-WAIVE crypt Makeconfig socket
CANCEL-FILE-WAIVE csu Makefilesoft-fp
catgetsctype Makefile.in stdio-common
ChangeLogdebug Makerules stdlib
ChangeLog.dirent mallocstreams
ChangeLog.dlfcn manualstring
ChangeLog.elf mathsunrpc
ChangeLog.extra-lib.mkmiscsysdeps
ChangeLog.extra-modules.mk NAMESPACE sysvipc
ChangeLog.FAQ NEWStermios
ChangeLog.FAQ.in nistest-skeleton.c
ChangeLog.gmon NOTEStime
ChangeLog.gnulib nptltimezone
ChangeLog.grp nptl_dbtls.make.c
ChangeLog.gshadow nscdversion.h
ChangeLog.hesiod nssVersions.def
ChangeLog.hurd o-iterator.mk wcbs
ChangeLog.iconv powctype
ChangeLog.iconvdataposixWUR-REPORT
ChangeLog.include PROJECTS
ChangeLog.inet pwd
conf INSTALL README
c.在glibc源碼目錄建立構(gòu)建目錄,并cd進入構(gòu)建目錄
view plain copy
$ mkdir build
view plain copy
$ cd build
d.運行configure配置,make && sudo make install
view plain copy
$ ../configure –prefix=/opt/glibc-2.14
$ make -j4
$ sudo make install
password for ghui:
4.臨時修改環(huán)境變量
view plain copy
$ export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH
view plain copy
$ cd /var/VMdisks/cross/mingw32/bin/
view plain copy
$ ./qmake
Usage: ./qmake
QMake has two modes, one mode for generating project files based on
some heuristics, and the other for generating makefiles. Normally you
shouldn’t need to specify a mode, as makefile generation is the default
mode for qmake, but you may use this to test qmake on an existing project
…
此時運行正常,問題解決。
By ghui
怎么解決安裝linux軟件的依賴問題
使用yum install命令安裝,會自動安裝依賴軟件
利用yum安裝軟件(自動解決依賴關(guān)系)
YUM有以下特點:
1、可以同時配置多個資源庫(Repository)
2、簡潔的配置文件(/etc/yum.conf)
3、自動解決增加或刪除rpm包時遇到的依賴衫歲性問題使用方便
4、YUM分為服務(wù)器端和客戶端
搭建yum服務(wù)器:
1、掛載redhat5.5安裝光盤。
2、安裝vsftp軟件。
3、解除掛載,然后重新掛載到/var/ftp/pub/下(客戶端利用ftp下載軟件包,通過yum命令安裝ftp上的軟晌歲件)
4、利用或謹睜vi修改/etc/yum.repos.d/rhel-debuginfo.repo文件,這個文件是客戶端修改的文件,我直接在服務(wù)器修改了,用于填寫yum服務(wù)器的地址和軟件包ftp的位置。
5、下面以安裝dns服務(wù)器軟件 bind為例,如果不利用yum安裝,需要解決依賴關(guān)系,比較麻煩。如下圖:
6、上圖可以看出,安裝出錯,需要首先安ind-9.3.6-4…..之后才能安ind-chroot-9.3,下面先安ind-9.3.6-4。
7、然后再安ind-chroot-9.3,如圖所示可以正常安裝了。
在Linux系統(tǒng)中,軟件包的依賴關(guān)系讓人很是頭疼。如在安裝Linux系統(tǒng)時,不是選擇安裝所有的軟件包。在安裝完Linux系統(tǒng)后,若再進行軟件安裝的話,就可能會遇到一些依賴關(guān)系的問題,如在安裝PHP軟件包時,系統(tǒng)就可能會提示一些錯誤信息。說需要其他的一些軟件包的支持。其實類似的情況在Windows中也會遇到。如有時候安裝一些應(yīng)用軟件可能對瀏覽器的版本會有要求或者要求操作系統(tǒng)的補丁達到SP2以上等等。不過在微軟操作系統(tǒng)上這種軟件依賴關(guān)系要比在Linux系統(tǒng)中少見的多,而且處理起來也方便一些。 那么Linux操作系統(tǒng)中如果遇到這種軟件包依賴關(guān)系的話,該如何處理呢?在談這個具體的解決措施之前,我先跟大家說說在哪些情況下容易出現(xiàn)軟件包的依賴關(guān)系問題?! ∫皇窃诓僮飨到y(tǒng)安裝的時候,沒有選擇全部的軟件包。大部分時候出于安全或者其他方面的原因,Linux系統(tǒng)管理員往往不會選擇安裝全部的軟件包。而只是安裝一些運行相關(guān)服務(wù)所必要的軟件包。但是有時候系統(tǒng)管理員可能并不清楚哪些軟件包是必須要裝的,否則后續(xù)的一些服務(wù)將無法啟動;而那些軟件包則是可選的。由于在系統(tǒng)安裝的時候很難一下子弄清楚這些內(nèi)容,故在Linux系統(tǒng)安裝完畢后,再部署其他一些軟件包的時候,就容易出現(xiàn)這個問題?! 《窃贚inux服務(wù)器上追加其他的一些應(yīng)用服務(wù)時,容易出現(xiàn)類似的問題。如有一次企業(yè)需要使用一個Oracle數(shù)據(jù)庫,我就在原先的文件服務(wù)器上安裝Oracle數(shù)據(jù)庫。但是在Linux操作系統(tǒng)上安裝Oracle服務(wù)器是一個很頭疼的問題,需要安裝不少的軟件包。而我一開始部署Linux文件服務(wù)器的時候又不知道后來需要安裝Oracle數(shù)據(jù)庫,故不少的軟件包都沒有裝。而且后來發(fā)現(xiàn),不少的軟件包其實在Linux安裝盤中還沒有,需要自己到網(wǎng)上去下。所以,如果要在原先已經(jīng)部署好的Linux服務(wù)器中追加一些應(yīng)用服務(wù)時,很容易出現(xiàn)這個軟件包的依賴問題。 其實解決這個軟件包的依賴問題說簡單也不簡單,說復(fù)雜也不復(fù)雜。我下面總結(jié)了幾個方法,各位若有需要的話可以借鑒一下?! ∫弧⒏鶕?jù)錯誤提示信息在安裝光盤中尋找?! ≡诎惭b軟件包時如果遇到軟件依賴關(guān)系問題時,通常情況下系統(tǒng)都會提示相關(guān)的信息。如提示“l(fā)ibgd.so.1.8 is needey by php-4.2.2-17”等等。這就表示安裝PHP程序時,需要先安裝libgd.so軟件包。當遇到這個問題時,我建議系統(tǒng)管理員可以根據(jù)這個提示信息,先從Linux系統(tǒng)的安裝盤中查找一隱知下是否有這個軟件包?! ∪缟蠄D所示,在Linux安裝盤中的RPMS目錄下面就存放著大量的軟件包喚明。通常情況下,像上面的libgd.so等常見的軟件包都可以從和攜告這個光盤中找到。所以系統(tǒng)管理員根據(jù)系統(tǒng)的錯誤提示信息,就可以了解到安裝某個軟件之前先要安裝那個軟件包。然后從系統(tǒng)光盤中找到這個軟件包,并進行安裝即可。另外需要說明的是,向RedHat操作系統(tǒng),如果采用的是CD安裝盤,則其可能有很多張光盤。而這些軟件包往往不是存儲在一張CD光盤中的。不過可以肯定的是,每張光盤下都會有RPMS這個目錄。當系統(tǒng)管理員不知道某個軟件包存儲在哪個盤中的話,則可以一張張的找過去。雖然比較麻煩一點,但是大部分情況下都會有收獲的。 不過如果采用這個方法有一個限制。像安裝Oracle這種大型的應(yīng)用軟件就不怎么適用。因為安裝這種大型的軟件本身就比較花費時間。如果等到安裝失敗之后再根據(jù)錯誤提示來安裝軟件包的話,則重復(fù)來重復(fù)去會浪費很多的時間,而且也會讓系統(tǒng)產(chǎn)生很多的垃圾文件。為此除非是一些小型的軟件包,否則的話,更好還是根據(jù)下面我要介紹的方法來做,以節(jié)省軟件安裝的時間?! 《?、參考官方的文檔?! ⊥ǔG闆r下,一些軟件的官方文檔會說明安裝它們的軟件需要哪些軟件包。如在安裝Oracle數(shù)據(jù)庫時,就必須需要安裝不少的軟件包。到底需要安裝哪些軟件包,在Oracle的官方網(wǎng)站上都會有詳細的說明。我在安裝Oracle數(shù)據(jù)庫時,就先安裝這個說明,一一來驗證Linux系統(tǒng)中是否安裝了這些軟件包。如果沒有安裝的話,就馬上裝上去。此時各位Linux系統(tǒng)管理員不要抱著僥幸心理,已經(jīng)不安裝不會有大問題,這是大錯特錯了。對于Oracle公司官方網(wǎng)站建議的軟件包在Oracle數(shù)據(jù)庫系統(tǒng)安裝之前必須一五一十的安裝上去。否則的話輕則導(dǎo)致數(shù)據(jù)庫安裝失敗,重者的話會導(dǎo)致后續(xù)數(shù)據(jù)庫運行不穩(wěn)定。 其實不光是Oracle數(shù)據(jù)庫系統(tǒng),其他的一些應(yīng)用軟件對Linux系統(tǒng)都會有類似的要求。它們要求在安裝它們的應(yīng)用軟件之前,Linux系統(tǒng)必須安裝有某些軟件包,否則的話安裝就會失敗。所以我建議各位Linux系統(tǒng)管理員,在安裝這些軟件之前,更好先到官方網(wǎng)站上去尋找類似的文檔,然后對照文檔的內(nèi)容去驗證Linux系統(tǒng)是否安裝了這些軟件包。如此的話就可以避免軟件包依賴關(guān)系的問題。另外,在網(wǎng)絡(luò)上也可以尋找到很多有用的價值。有些安裝過這個軟件的Linux系統(tǒng)管理員,會把自己安裝過程中系統(tǒng)遇到的軟件包依賴關(guān)系列舉出來,會一一說明需要先安裝哪些軟件包。這些網(wǎng)絡(luò)上的文檔雖然其專業(yè)性可能沒有官方提供的文檔那么專業(yè)。但是對我們來說也具有很大的參考價值?! ∪?、從專業(yè)網(wǎng)絡(luò)上查詢?! 榱苏_安裝某些軟件包,需要安裝一些文件??墒怯袝r候系統(tǒng)管理員可能根據(jù)系統(tǒng)的提示還不能夠確定到底安裝哪些軟件包才會有這些文件。特別是對于一些不常用的軟件包或者系統(tǒng)管理員之一次接觸的軟件包往往會遇到這種問題。此時,系統(tǒng)管理員就可以到一些專業(yè)的網(wǎng)站上去查詢。這里我給大家介紹一個很不錯的網(wǎng)站,即
。系統(tǒng)管理員只需要在這個網(wǎng)站搜索的地方輸入需要的文件名字,如libgd.so,則搜索結(jié)果中就會顯示需要安裝哪個軟件包才具有這個文件。找到這個軟件包的名字之后,只需要從光盤或者網(wǎng)絡(luò)上下載這個軟件包進行安裝即可。當然,在安裝這些軟件包的時候,可能還會遇到其他軟件包依賴關(guān)系的問題。如安裝php軟件包需要libgd.so文件,而這個文件屬于gb軟件包。但是在安裝gb軟件包時,可能這個軟件包跟其他軟件包又具有依賴關(guān)系,又需要安裝其他軟件包才行。此時系統(tǒng)管理員就需要耐心的一一按順序進行解決了。 可見大部分情況下,在遇到軟件包依賴關(guān)系問題的時候,操作系統(tǒng)提供的文件名字與軟件包名字都會有直接的聯(lián)系。有可能文件的名字就是軟件包的名字。但是有些時候文件的名字與軟件包的名字會相差甚遠。此時大部分系統(tǒng)管理員可能光憑文件名字無法找到對應(yīng)的軟件包。此時就需要借助筆者上面談到的一些專業(yè)網(wǎng)站,去查詢軟件包的名字了。 另外我還有一個小建議。當系統(tǒng)管理員安裝了某個軟件之后,如果存在軟件包之間的依賴關(guān)系,則更好能夠拿本子或者通過其他手段記錄下來。因為在以后的工作中很有可能還會需要安裝這些軟件。如此的話,在下次安裝的時候就不用這么麻煩了??梢詫φ找郧暗墓P記直接安裝需要的軟件包。畢竟在同一個地方摔倒多次不是什么光彩的事情。
一般制作yum倉庫,可以解決。你在可以在網(wǎng)上搜索制作yum倉庫的資料,做起來很簡單的。
這里下載相豎察應(yīng)的叢纖檔軟件滲亂啊
Linux下程序運行依賴庫如何指定?
so文件內(nèi)部有一個自己的名字派祥,可以和文塵洞搏件名不同,這個名字由鏈接器在link期間寫入so
庫文件
中。
你可以使用 readelf -a b.so | grep SONAME,顫裂來查看
這個內(nèi)部名字不因為文件名變化而改變。
關(guān)于linux下依賴dll的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機房服務(wù)器托管租用。
當前題目:Linux上的動態(tài)鏈接庫依賴問題 (linux下依賴dll)
鏈接URL:http://m.fisionsoft.com.cn/article/codohjc.html


咨詢
建站咨詢
