軟硬鏈接
軟硬鏈接的區(qū)別:
- **軟鏈接:**是一個(gè)獨(dú)立文件,有自己獨(dú)立的 inode 和 inode 編號(hào)。
- **硬鏈接:**不是一個(gè)獨(dú)立的文件,它和目標(biāo)文件使用的是同一個(gè) inode。硬鏈接就是單純的在 Linux 指定的目錄下,給指定的文件新增 文件名 和 inode 編號(hào)的映射關(guān)系!
我們可以通過(guò)如下命令,創(chuàng)建一個(gè)文件的軟硬鏈接:
$ ln -s 文件名 鏈接文件名 # 創(chuàng)建軟連接
$ ln 文件名 鏈接文件名 # 創(chuàng)建硬鏈接
理解硬鏈接:
我們看到,真正找到磁盤上文件的并不是文件名,而是inode。 其實(shí)在linux中可以讓多個(gè)文件名對(duì)應(yīng)于同一個(gè)
inode。
[root@localhost linux]# touch abc [root@localhost linux]# ln abc def
[root@localhost linux]# ls -1i
abc def 263466 abc 263466 def
-
abc和def的鏈接狀態(tài)完全相同,他們被稱為指向文件的硬鏈接。內(nèi)核記錄了這個(gè)連接數(shù),inode
263466 的硬連接數(shù)為2。
-
我們?cè)趧h除文件時(shí)干了兩件事情:1.在目錄中將對(duì)應(yīng)的記錄刪除,2.將硬連接數(shù)-1,如果為0,則將對(duì)應(yīng)
的磁盤釋放。
硬連接數(shù):
ll
這些數(shù)字就硬鏈接數(shù)
硬鏈接本質(zhì)就是該文件 inode 屬性中的一個(gè)計(jì)數(shù)器 count。用來(lái)標(biāo)識(shí)就幾個(gè)文件名和我的 inode 建立了映射關(guān)系。簡(jiǎn)而言之,就是有自己文件名指向我的 inode (文件本身) 。
理解軟鏈接:
我們創(chuàng)建一個(gè)軟連接,可以使用下面的指令:
$ ln -s 文件名 鏈接文件名 # 創(chuàng)建軟連接
我們可以很明顯的發(fā)現(xiàn)他們的inode不同
我們創(chuàng)建一個(gè)mytest.c,內(nèi)容如下:
#include <stdio.h>
int main(void) {
printf("hello, soft link...\n");
printf("hello, soft link...\n");
printf("hello, soft link...\n");
printf("hello, soft link...\n");
printf("hello, soft link...\n");
printf("hello, soft link...\n");
return 0;
}
程序正常運(yùn)行,這里我們?cè)?上級(jí)目錄的上級(jí)目錄 下直接 ./mytest.exe 就可以運(yùn)行。
但是,如果我們?nèi)绻朐谕饷孢\(yùn)行這個(gè)程序就會(huì)很累,因?yàn)樗穆窂接悬c(diǎn)深:
太麻煩了,所以這里我們就可以給它建立一個(gè)軟連接,解脫雙手:
$ ln -s ./lesson18/mytest.exe my.exe
直接./my.exe解放雙手
這就很像window下的快捷桌面方式(忽略右上角的紅色軟件,我是愛(ài)學(xué)習(xí)的孩子)
軟硬鏈接的刪除:
刪除的話可以直接 rm,但是我們還是建議使用專門的 取消鏈接 的指令:unlink
unlike 文件名
動(dòng)靜態(tài)庫(kù):
什么是動(dòng)靜態(tài)庫(kù)?
動(dòng)態(tài)庫(kù) .so:程序在運(yùn)行的時(shí)才去鏈接動(dòng)態(tài)庫(kù)的代碼,多個(gè)程序共享使用庫(kù)的代碼。
靜態(tài)庫(kù) .a:程序在編譯鏈接的時(shí)候把庫(kù)的代碼鏈接到可執(zhí)行文件中。程序運(yùn)行的時(shí)候?qū)⒉辉傩枰o態(tài)庫(kù)
一個(gè)與動(dòng)態(tài)庫(kù)鏈接的可執(zhí)行文件僅僅包含它用到的函數(shù)入口地址的一個(gè)表,而不是外部函數(shù)所在目標(biāo)文
件的整個(gè)機(jī)器碼
動(dòng)態(tài)鏈接和靜態(tài)鏈接:
動(dòng)態(tài)鏈接:
在可執(zhí)行文件開(kāi)始運(yùn)行以前,外部函數(shù)的機(jī)器碼由操作系統(tǒng)從磁盤上的該動(dòng)態(tài)庫(kù)中復(fù)制到內(nèi)存中,這個(gè)
過(guò)程稱為動(dòng)態(tài)鏈接(dynamic linking)
動(dòng)態(tài)庫(kù)可以在多個(gè)程序間共享,所以 動(dòng)態(tài)鏈接使得可執(zhí)行文件更小,節(jié)省了磁盤空間。 操作系統(tǒng)采用虛擬內(nèi)存 (VM) 機(jī)制允許物理內(nèi)存中的一份動(dòng)態(tài)庫(kù)被要用到該庫(kù)的所有進(jìn)程共用,節(jié)省了內(nèi)存和磁盤空間。
靜態(tài)鏈接:
靜態(tài)鏈接比較暴力,鏈接時(shí)候直接將目標(biāo)接口的二進(jìn)制代碼全部鏈接到原文件中去,這也就是靜態(tài)鏈接生成的文件這么大的原因了;(畢竟把二進(jìn)制代碼copy過(guò)來(lái)了)
但是這些都是相對(duì)的,有優(yōu)點(diǎn)就有缺點(diǎn):
萬(wàn)一動(dòng)態(tài)庫(kù)路徑中的庫(kù)丟失損壞 ,動(dòng)態(tài)鏈接的程序到目標(biāo)位置了,過(guò)來(lái)用的時(shí)候肯定出錯(cuò)了;
靜態(tài)鏈接因?yàn)榫幾g的時(shí)候吧二進(jìn)制代碼考過(guò)去了,不依賴原生庫(kù),即便原庫(kù)代碼丟失也沒(méi)事;
生成動(dòng)靜態(tài)庫(kù):
生成靜態(tài)庫(kù):
$ ar -rc [靜態(tài)庫(kù)] [.o]
庫(kù)的命名以 lib 開(kāi)頭,靜態(tài)庫(kù)以 .a 結(jié)尾,
此時(shí)我們就有了靜態(tài)庫(kù),所謂了靜態(tài)庫(kù)就是曾經(jīng)的源文件最終將它翻譯成 .o 打包起來(lái)的東西而已。而別人用我們的庫(kù),就是在庫(kù)里找到 .o 然后丟到而可執(zhí)行程序里就行。
生成動(dòng)態(tài)庫(kù):
動(dòng)態(tài)庫(kù)比靜態(tài)庫(kù)要復(fù)雜一些,
gcc -fPIC -c myadd.c -o myadd.o
gcc -shared -o libmyadd.so myadd.o
別在于 形成 .o 的時(shí)候是需要加上 gcc -fPIC 的,這是為了產(chǎn)生 與位置無(wú)關(guān)碼。
使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù):
現(xiàn)在我們站在使用的人的角度,學(xué)習(xí)如何使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
使用動(dòng)態(tài)庫(kù)
-Ⅰ 表示我們的頭文件查找的路徑
-L 表示庫(kù)文件搜索的路徑
-l 在-L 指定的路徑下你要鏈接哪一個(gè)庫(kù).
示例:
gcc mytest.c -o mytest -I lib-dyl/include/ -L lib-dyl/lib/ -l mymath
形成可執(zhí)行程序之后,已經(jīng)把需要的代碼拷貝到我的代碼中,運(yùn)行時(shí)不依賴你的庫(kù)。不需要運(yùn)行時(shí)查找。
為什么動(dòng)態(tài)庫(kù)會(huì)有這個(gè)問(wèn)題?想辦法讓進(jìn)程找到動(dòng)態(tài)庫(kù)即可。
error while loading shared libraries 解決方案:
① 動(dòng)態(tài)庫(kù)拷貝到系統(tǒng)路徑下 /lib64 安裝。
② 通過(guò)導(dǎo)入環(huán)境變量的方式 —— 程序運(yùn)行的時(shí)候,會(huì)在環(huán)境變量中查找自己需要的動(dòng)態(tài)庫(kù)路徑 —— LD_LIBRARY_PATH。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-752624.html
③ 系統(tǒng)配置文件來(lái)做。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-752624.html
不需要運(yùn)行時(shí)查找。
為什么動(dòng)態(tài)庫(kù)會(huì)有這個(gè)問(wèn)題?想辦法讓進(jìn)程找到動(dòng)態(tài)庫(kù)即可。
error while loading shared libraries 解決方案:
① 動(dòng)態(tài)庫(kù)拷貝到系統(tǒng)路徑下 /lib64 安裝。
② 通過(guò)導(dǎo)入環(huán)境變量的方式 —— 程序運(yùn)行的時(shí)候,會(huì)在環(huán)境變量中查找自己需要的動(dòng)態(tài)庫(kù)路徑 —— LD_LIBRARY_PATH。
③ 系統(tǒng)配置文件來(lái)做。
到了這里,關(guān)于【Linux】軟硬鏈接和動(dòng)靜態(tài)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!