新聞中心
如何在Linux中使用動(dòng)態(tài)庫(kù)并設(shè)置當(dāng)前路徑

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、斗門ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的斗門網(wǎng)站制作公司
在Linux下使用動(dòng)態(tài)庫(kù)可以大大節(jié)省內(nèi)存空間,提高程序的執(zhí)行效率。動(dòng)態(tài)庫(kù)又稱共享庫(kù),在程序運(yùn)行時(shí)才會(huì)被載入內(nèi)存,與之相對(duì)的是靜態(tài)庫(kù),它們?cè)诰幾g階段就會(huì)被鏈接到程序中。本文將介紹如何在Linux中使用動(dòng)態(tài)庫(kù),并設(shè)置當(dāng)前路徑。
一、動(dòng)態(tài)庫(kù)的介紹
動(dòng)態(tài)庫(kù)由多個(gè)模塊組成,每個(gè)模塊都是一個(gè)獨(dú)立的二進(jìn)制文件,它們可以相互依賴。在程序運(yùn)行時(shí),只有當(dāng)需要使用某個(gè)模塊時(shí)才會(huì)加載這個(gè)模塊。這使得動(dòng)態(tài)庫(kù)比靜態(tài)庫(kù)更為靈活,在程序中經(jīng)常被使用。
動(dòng)態(tài)庫(kù)的文件格式一般為.so,Linux中的庫(kù)文件都安裝在默認(rèn)的系統(tǒng)路徑下,如/usr/lib、/lib等,程序在編譯時(shí)會(huì)自動(dòng)鏈接到這些庫(kù)文件。
二、使用動(dòng)態(tài)庫(kù)
在程序中使用動(dòng)態(tài)庫(kù)需要使用到動(dòng)態(tài)鏈接庫(kù)(ld)。在編譯時(shí),需要使用-l選項(xiàng)指定動(dòng)態(tài)庫(kù)的名字,編譯器會(huì)在默認(rèn)的庫(kù)路徑下查找這個(gè)庫(kù),并鏈接到程序中。
例如:
gcc -o myapp myapp.c -lm
其中,-lm表示鏈接到數(shù)學(xué)庫(kù)(libm.so)。
如果動(dòng)態(tài)庫(kù)不在默認(rèn)的庫(kù)路徑下,可以使用-L選項(xiàng)指定動(dòng)態(tài)庫(kù)的搜索路徑。
例如:
gcc -o myapp myapp.c -L /usr/local/lib/ -lmylib
其中,-L /usr/local/lib/指定了動(dòng)態(tài)庫(kù)的搜索路徑,-lmylib表示鏈接到名為libmylib.so的動(dòng)態(tài)庫(kù)。
三、設(shè)置當(dāng)前路徑
在程序中使用動(dòng)態(tài)庫(kù)時(shí),程序會(huì)在默認(rèn)的搜索路徑中查找動(dòng)態(tài)庫(kù),如果沒(méi)有找到,那么程序就無(wú)法執(zhí)行。為了避免這種情況的發(fā)生,可以將程序需要使用的動(dòng)態(tài)庫(kù)放在程序的當(dāng)前路徑下。
在Linux中,可以使用LD_LIBRARY_PATH環(huán)境變量來(lái)設(shè)置程序的當(dāng)前路徑。
例如:
export LD_LIBRARY_PATH=/home/user/mylibs/:$LD_LIBRARY_PATH
其中,/home/user/mylibs/是自定義的當(dāng)前路徑,$LD_LIBRARY_PATH是保留的環(huán)境變量,表示將當(dāng)前路徑添加到默認(rèn)的搜索路徑之前。
四、
本文介紹了在Linux中使用動(dòng)態(tài)庫(kù)及設(shè)置當(dāng)前路徑的方法。動(dòng)態(tài)庫(kù)可以提高程序的執(zhí)行效率,使程序更靈活。設(shè)置當(dāng)前路徑可以保證程序能夠正確地搜索到動(dòng)態(tài)庫(kù),避免出現(xiàn)鏈接錯(cuò)誤的問(wèn)題。需要注意的是,動(dòng)態(tài)庫(kù)的使用需要在編譯時(shí)指定庫(kù)的名字,同時(shí)也需要將庫(kù)文件放在正確的位置,才能夠被程序正確加載。
相關(guān)問(wèn)題拓展閱讀:
- linux編譯的c++程序位置
linux編譯的c++程序位置
linux系統(tǒng)編譯C++程序時(shí)頭?件和庫(kù)?件搜索路徑
C++編譯時(shí),教科書中寫道:#include “headfile.h”優(yōu)先在當(dāng)前?錄查找頭?件;#include 從系統(tǒng)默認(rèn)路徑查找頭?件。先
前以為系統(tǒng)默認(rèn)路徑是環(huán)境變量$PATH指定的路徑,在系統(tǒng)上?查,傻了眼:
-bash-3.2$ echo$PATH
/usr/local/bin:/bin:/usr/bin:/in:/usr/in:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp
全是bin?錄,$PATH是運(yùn)?可執(zhí)??件時(shí)的搜索路徑,與include頭?件的搜索路徑?關(guān),可能不少?犯了我這樣的錯(cuò)誤。
頭?件:
1. #include“headfile.h”
搜索順序?yàn)椋?/p>
①先搜索當(dāng)前?錄
②然后搜索-I指定的?錄
③再搜索gcc的環(huán)境變量CPLUS_INCLUDE_PATH(C程序使?的是C_INCLUDE_PATH)
④最后搜索gcc的內(nèi)定?錄
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
各?錄存在相同?件時(shí),先找到哪個(gè)使?哪個(gè)。
2. #include
①先搜索-I指定的?錄
②然后搜索gcc的環(huán)境變量CPLUS_INCLUDE_PATH
③最后搜索gcc的內(nèi)定?錄
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
與上?的相同,各?錄存在相同?件時(shí),先找到哪個(gè)使?哪個(gè)。這?要注意,#include?式不會(huì)搜索當(dāng)前?錄!
這?要說(shuō)下include的內(nèi)定?錄,它不是由$PATH環(huán)境變量指定的,?是由g++的配置prefix指定的(知道它在安裝g++時(shí)可以指定,不知安
裝后如何修改的,可能是修改配置?件,需要時(shí)再研究下):
-bash-3.2$ g++ -v
Using built-inspecs.
Target:x86_64-redhat-linux
Configured with:../configure –prefix=/usr –mandir=/usr/share/man–infodir=/usr/share/info –enable-shared –enable-threads=posix–enable-checking=release –with-system-zlib –enable-__cxa_atexit–disable-libunwind-exceptions –enable-libgcj-multifile–enable-languages=c,c++,objc,obj-c++,java,fortran,ada–enable-java-awt=gtk –disable-dssi –enable-plugin–with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre–with-cpu=generic –host=x86_64-redhat-linux
Thread model:posix
gcc version 4.1.(Red Hat 4.1.2-46)
在安裝g++時(shí),指定了prefix,那么內(nèi)定搜索?錄就是:
Prefix/include
Prefix/local/include
Prefix/lib/gcc/–host/–version/include
編譯時(shí)可以通過(guò)-nostdinc++選項(xiàng)屏蔽對(duì)內(nèi)定?錄搜索頭?件。
庫(kù)?件:
編譯的時(shí)候:
①gcc會(huì)去找-L
②再找gcc的環(huán)境變量LIBRARY_PATH
③再找內(nèi)定?錄/lib /usr/lib/usr/local/lib 這是當(dāng)初compilegcc時(shí)寫在程序內(nèi)的(不可配置的?)
運(yùn)?時(shí)動(dòng)態(tài)庫(kù)的搜索路徑:
動(dòng)態(tài)庫(kù)的搜索路徑搜索的先后順序是:
①編譯?標(biāo)代碼時(shí)指定的動(dòng)態(tài)庫(kù)搜索路徑(這是通過(guò)gcc 的參數(shù)”-Wl,-rpath,”指定。當(dāng)指定多個(gè)動(dòng)態(tài)庫(kù)搜索路徑時(shí),路徑之間?冒號(hào)”:”分隔)
②環(huán)境變量LD_LIBRARY_PATH指定的動(dòng)態(tài)庫(kù)搜索路徑(當(dāng)通過(guò)該環(huán)境變量指定多個(gè)動(dòng)態(tài)庫(kù)搜索路徑時(shí),路徑之間?冒號(hào)”:”分隔)
③配置?件/etc/ld.so.conf中指定的動(dòng)態(tài)庫(kù)搜索路徑;
④默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib;
⑤默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/usr/lib。
(應(yīng)注意動(dòng)態(tài)庫(kù)搜尋路徑并不包括當(dāng)前?件夾,所以當(dāng)即使可執(zhí)??件和其所需的so?件在同??件夾,也會(huì)出現(xiàn)找不到so的問(wèn)題,類同#include不搜索當(dāng)前?錄)
¥
百度文庫(kù)VIP限時(shí)優(yōu)惠現(xiàn)在開(kāi)通,立享6億+VIP內(nèi)容
立即獲取
linux系統(tǒng)編譯C++程序時(shí)頭文件和庫(kù)文件搜索路徑
linux系統(tǒng)編譯C++程序時(shí)頭?件和庫(kù)?件搜索路徑
C++編譯時(shí),教科書中寫道:#include “headfile.h”優(yōu)先在當(dāng)前?錄查找頭?件;#include 從系統(tǒng)默認(rèn)路徑查找頭?件。先
前以為系統(tǒng)默認(rèn)路徑是環(huán)境變量$PATH指定的路徑,在系統(tǒng)上?查,傻了眼:
-bash-3.2$ echo$PATH
/usr/local/bin:/bin:/usr/bin:/in:/usr/in:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp
第 1 頁(yè)
全是bin?錄,$PATH是運(yùn)?可執(zhí)??件時(shí)的搜索路徑,與include頭?件的搜索路徑?關(guān),可能不少?犯了我這樣的錯(cuò)誤。
頭?件:
1. #include“headfile.h”
搜索順序?yàn)椋?/p>
①先搜索當(dāng)前?錄
②然后搜索-I指定的?錄
③再搜索gcc的環(huán)境變量CPLUS_INCLUDE_PATH(C程序使?的是C_INCLUDE_PATH)
展開(kāi)全文
?
限免
導(dǎo)長(zhǎng)圖
轉(zhuǎn)存到網(wǎng)盤
發(fā)送至微信
下載文檔
北京百度網(wǎng)訊科技有限公司 版本號(hào)8.0.70
關(guān)于linux 動(dòng)態(tài)庫(kù) 當(dāng)前路徑的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營(yíng)銷公司
成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站維護(hù),網(wǎng)絡(luò)營(yíng)銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務(wù)。IDC基礎(chǔ)服務(wù):云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)、服務(wù)器租用、服務(wù)器托管提供四川、成都、綿陽(yáng)、雅安、重慶、貴州、昆明、鄭州、湖北十堰機(jī)房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)。
網(wǎng)頁(yè)題目:「如何在Linux中使用動(dòng)態(tài)庫(kù)并設(shè)置當(dāng)前路徑」 (linux 動(dòng)態(tài)庫(kù) 當(dāng)前路徑)
分享地址:http://m.5511xx.com/article/dhjdooi.html


咨詢
建站咨詢
