軟鏈接
命令:
ln -s 源文件名 目標(biāo)文件名
軟鏈接是獨(dú)立連接文件的,他有自己的inode number,有自己的inode屬性和內(nèi)容。
軟鏈接內(nèi)部存放的是自己所指向文件的路徑。
現(xiàn)實(shí)中,我們軟鏈接的應(yīng)用有,例如電腦桌面的快捷模式等。inode number
不相同
硬鏈接
命令:
ln 源文件目標(biāo)文件
硬鏈接,通過inode來重新鏈接一份文件,此文件的inode跟原文件的inode是一樣的,可以理解為原文件的淺拷貝,兩個(gè)文件內(nèi)容是共享的,不管增加還是刪除,這是因?yàn)樗麄兊膇node是相同的inode
相等
硬鏈接要注意
硬鏈接是不可以給目錄做硬鏈接的,這是因?yàn)楫?dāng)用戶進(jìn)行對(duì)目錄硬鏈接時(shí),容易造成環(huán)路問題,os無法識(shí)別那個(gè)是自己定義的硬鏈接。
了解目錄隱藏文件
.
..
自定義實(shí)現(xiàn)一個(gè)靜態(tài)庫(kù)(.a)
- 系統(tǒng)已經(jīng)預(yù)裝了c/c++的頭文件和庫(kù)文件,頭文件提供方法說明,庫(kù)提供方法的實(shí)現(xiàn),頭和庫(kù)是有對(duì)應(yīng)關(guān)系的,是要組合在一起使用的。
- 頭文件是在預(yù)處理階段就引入的,鏈接本質(zhì)就是鏈接庫(kù)
方法一:頭文件和.o文件在一塊可直接應(yīng)用
形成靜態(tài)庫(kù)文件
命令:ar -rc lib庫(kù)名.a *.o
方法二:我們將庫(kù)和頭文件都帶入到另一個(gè)文件進(jìn)行重新編譯運(yùn)行
當(dāng)我們使用時(shí)發(fā)現(xiàn)不可以正常使用
這是因?yàn)槲覀円肓说谌降膸?kù),編譯器目前不認(rèn)可這個(gè)庫(kù),需要我們手動(dòng)
解決、使用方法
第三方庫(kù)的使用錯(cuò)誤解決方法:
- 需要指定所用的頭文件和庫(kù)文件
- 如果沒有安裝到對(duì)應(yīng)的編譯器路徑下,用戶必須指明對(duì)應(yīng)的選項(xiàng),告知編譯器,頭文件在哪里,庫(kù)文件在哪里,庫(kù)文件具體是誰。
- 將三方庫(kù)拷貝到編譯器路徑下時(shí),我們進(jìn)行編譯時(shí),也需要使用
-l
指定具體使用的庫(kù)
l
:只要庫(kù)名即可(去掉lib以及版本號(hào))L
:鏈接庫(kù)所在的路徑I
:鏈接庫(kù)的頭文件所在路勁
方法三:頭文件放到include目錄下,庫(kù)文件放到lib目錄下,將兩個(gè)目錄打包交給別人
靜態(tài)庫(kù)的內(nèi)部加載過程
靜態(tài)庫(kù)不需要加載,靜態(tài)庫(kù)是將代碼直接拷貝到程序中,因此內(nèi)存中的代碼和數(shù)據(jù)可能會(huì)存在多分,造成空間浪費(fèi)。把靜態(tài)庫(kù)代碼拷貝到內(nèi)存中的代碼區(qū)。
當(dāng)我們將靜態(tài)庫(kù)加載過一次之后,在刪除靜態(tài)庫(kù)后還是可以正常跑的
自定義實(shí)現(xiàn)一個(gè)動(dòng)態(tài)庫(kù)(.so)
形成動(dòng)態(tài)庫(kù)文件
shared
: 表示生成共享庫(kù)格式fPIC
:產(chǎn)生位置無關(guān)碼
動(dòng)態(tài)庫(kù)采用的是相對(duì)位置編址。只保存相對(duì)函數(shù)之間的偏量值(庫(kù)起始地址+函數(shù)之間偏移量)
而靜態(tài)庫(kù)采用的為絕對(duì)地址,如果我們庫(kù)位置有所變動(dòng),他就需要重新拷貝![]()
與靜態(tài)庫(kù)使用發(fā)放三方式相同,但是需要注意的方面不一樣
頭文件放到include目錄下,庫(kù)文件放到lib目錄下,將兩個(gè)目錄打包交給別人
為什么靜態(tài)庫(kù)就可以找到而動(dòng)態(tài)庫(kù)就不可以呢?
這是因?yàn)殪o態(tài)庫(kù)的鏈接原則是將用戶使用的二進(jìn)制代碼直接拷貝到目標(biāo)可執(zhí)行程序中但是動(dòng)態(tài)庫(kù)不會(huì)。
如何解決os找不到動(dòng)態(tài)庫(kù)問題?
- 配置環(huán)境變
LD_LIBRARY_PATH
(臨時(shí)方案,當(dāng)系統(tǒng)重啟后需要重新配置)![]()
- 軟連接方案
去掉軟連接方法sudo unlink /lib64/libmy_math.so
- 配置文件方法
ls /etc/ld.so.conf.d
查看本地的路徑配置文件sudo touch /etc/ld.so.conf.d/myPath.conf
添加創(chuàng)建本地路徑配置文件
系統(tǒng)重新啟動(dòng)也是可以直接使用的,因?yàn)槲覀円呀?jīng)把環(huán)境配置好了
動(dòng)態(tài)庫(kù)加載過程
動(dòng)態(tài)庫(kù)通過fPIC形成位置無關(guān)碼,采用相對(duì)編址的方式,在程序鏈接時(shí)將對(duì)應(yīng)庫(kù)中的偏移量添加到程序中,庫(kù)函數(shù)在程序運(yùn)行時(shí)加載進(jìn)來,經(jīng)過頁表,把庫(kù)映射到虛擬地址空間后(共享區(qū)),庫(kù)就具有了起始地址。通過起始地址和偏移地址,就可以找到要調(diào)用的庫(kù)函數(shù)。
系統(tǒng)層面上會(huì)維護(hù)動(dòng)態(tài)庫(kù)的起始地址(雖然剛剛加載時(shí)不能確定起始地址,因?yàn)楣蚕韰^(qū)是由OS分配的,但是加載完畢就不會(huì)改變了),直接建立頁表與內(nèi)存的映射,就可以直接跳轉(zhuǎn)訪問了。所以動(dòng)態(tài)庫(kù)加載一次就可以被多個(gè)進(jìn)程共同使用。
動(dòng)態(tài)庫(kù)相對(duì)于靜態(tài)庫(kù)更節(jié)省內(nèi)存,靜態(tài)庫(kù)由多個(gè)程序使用相同的庫(kù)函數(shù),加載到內(nèi)存中就會(huì)導(dǎo)致內(nèi)存中有多份重復(fù)的庫(kù)函數(shù)代碼,而動(dòng)態(tài)庫(kù)則是多個(gè)程序共用一份動(dòng)態(tài)庫(kù),不會(huì)導(dǎo)致出現(xiàn)重復(fù)的庫(kù)函數(shù)代碼,就節(jié)省了內(nèi)存空間。文章來源:http://www.zghlxwxcb.cn/news/detail-672314.html
靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的特點(diǎn)
靜態(tài)庫(kù)的特點(diǎn):文章來源地址http://www.zghlxwxcb.cn/news/detail-672314.html
- 靜態(tài)庫(kù)在可執(zhí)行程序鏈接時(shí)就加入到可執(zhí)行代碼中,在物理上成為可執(zhí)行程序的一部分;程序運(yùn)行時(shí)將不在需要該靜態(tài)庫(kù)。
- 相對(duì)于動(dòng)態(tài)庫(kù)鏈接生成的程序,靜態(tài)還相當(dāng)于編譯器將代碼補(bǔ)充完整了,因此執(zhí)行程序會(huì)大一些,但是運(yùn)行起來相對(duì)快一些。
- 靜態(tài)庫(kù)是犧牲了空間效率,換取了時(shí)間效率
動(dòng)態(tài)庫(kù)特點(diǎn):- 動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)程序中,而是在程序運(yùn)行時(shí)才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)的存在。
動(dòng)態(tài)庫(kù)只要在程序執(zhí)行時(shí),那些需要的函數(shù)代碼才被拷貝到內(nèi)存中。這樣就使可執(zhí)行文件比教小,節(jié)省磁盤空間。- 由于運(yùn)行時(shí)要去鏈接庫(kù)會(huì)花費(fèi)一定的時(shí)間,執(zhí)行速度可能會(huì)相對(duì)慢一些。
動(dòng)態(tài)庫(kù)是犧牲了時(shí)間效率,換取了空間效率。
到了這里,關(guān)于【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!