軟鏈結 硬鏈結 靜態庫 動態庫

2021-09-27 01:27:42 字數 2778 閱讀 3565

跟原始檔沒區別,通過相同的 inode 節點訪問到檔案資料 –乙個檔案別名

建立

建立硬鏈結檔案 – ln tmp.txt tmp.hard

建立軟鏈結檔案 – ln -s tmp.txt tmp.soft

區別

刪除原始檔,硬鏈結檔案的鏈結數 -1,並沒有刪除檔案,只有當 inode==0 才會徹底刪除;軟連線檔案失效

軟鏈結檔案可以跨分割槽建立,硬鏈結不可以,因為不同的分割槽有這自己的 inode 節點號,若進行硬鏈結inode節點將衝突

軟鏈結檔案可以對目錄建立,硬鏈結不可以,目錄結構本身就是跨分割槽的

ls -i :檢視 inode 節點號

gcc 生成動態庫和靜態庫

庫本質上來說是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行

linux 下的庫分為兩種:靜態庫和共享庫(動態庫)

二者的區別在於**被載入的時刻不同:

靜態庫的**在編譯過程中已經被載入可執行程式,因此可能導致可執行程式比較大,執行不需要依賴靜態庫的存在

共享庫的**是在執行的時候被載入記憶體,在編譯期間僅簡單的引用,因此體積小,但是執行需要依賴動態庫的存在

庫存在的意義

庫是別人寫好的,我們可以直接拿來使用,這樣很多東西我們都不用從零開始,用庫就可以實現,動態庫相比於靜態庫的好處是動態庫在執行時載入,因此不同的應用程式呼叫相同的庫檔案,那麼在記憶體中只需要存在乙份動態庫的例項(動態庫被載入到記憶體共享區)

庫檔案命名

動態庫名:lib***x.so.major.minor lib字首,***x動態庫名稱,.so字尾,major主版本號,minor副版本號

靜態庫名:lib***x.a lib字首,***x靜態庫名稱,.a字尾

檢視乙個可執行程式依賴的庫檔案

ldd 命令

下面自己生成乙個靜態庫和動態庫並使用

準備:main.c 檔案

#include

"hello.h"

#include

intmain()

hello.h 檔案

int

add(

int,

int)

;

hello.c 檔案

int

add(

int a,

int b)

靜態庫生成&&使用:

gcc -c hello.c -o hello.o 將原始檔編譯為目標**,不進行鏈結

ar -cr libmyhello.a hello.o 建立靜態庫檔案

ar -r 將 hello.o 加入到 libmyhello.a 中,預設是在庫的末尾新增

ar -c 建立庫檔案

使用:gcc -o main mian.c -l. -lmyhello

生成可執行檔案 然後 ./main 執行

這時即使刪除了靜態庫檔案 libmyhello.a 並不影響執行 main 程式

動態庫生出&&使用

gcc -c hello.c -o hello.o 將原始檔編譯為目標**,不進行鏈結

gcc --share -fpic -o libmyhello.so hello.o

-fpic:產生位置無關**,告訴 gcc 產生的**不要包含函式和變數的具體記憶體位置的引用,因為現在庫在程式沒有執行起來的時候不存在於記憶體中,因此只有程式執行起來庫載入到記憶體中才知道具體的記憶體位址空間

–share:將所有的目標**鏈結到一起生成動態庫而不是生成可執行程式

使用:gcc -o main main.c -l. -lmyhello

生成可執行程式,然後 ./main 執行

-lmyhello 告訴 gcc 程式在鏈結階段引用庫 libmyhello.so

-l 告訴 gcc 庫函式可能位於當前目錄中,否則 gnu 鏈結器會查詢標準系統函式目錄

環境變數 ld_library_path >> /etc/ld.so.cache 檔案列表 >> /lib /usr/lib 目錄

使用 gcc 的 -l 選項指定

將庫檔案直接放到指定路徑下 /lib,/lib64,/usr/lib,/usr/lib64

設定環境變數:library_path(冒號分割)指定鏈結庫檔案搜尋路徑

設定環境變數:ld_library_path(冒號分割)指定動鏈結庫檔案搜尋路徑

向 /etc/ld.so.conf.d/ 目錄下新增配置檔案,在配置檔案中新增庫的搜尋路徑,

指定庫的載入路徑(動態庫 程式執行時)

編譯目標**時指定的動態庫搜尋路徑

環境變數 ld_library_path 指定的動態庫搜尋路徑

配置檔案 /etc/ld.so.conf.d 中指定的動態庫搜尋路徑

將庫檔案直接放到指定路徑下 /lib,/lib64,/usr/lib,/usr/lib64

對於靜態庫只有乙個鏈結搜尋路徑,

對於 靜態庫 鏈結搜尋路徑 和 載入路徑 通常是同乙個路徑,但是如果動態庫鏈結搜尋路徑下的動態庫被刪除,就會到其他的可能存在的路徑下尋找

鏈結靜態庫不需要使用靜態鏈結 -static,只需要保證指定路徑下只有靜態庫就可以,鏈結器優先去指定的路徑下鏈結庫,用 -static 需要所有的庫都是靜態庫,linux 預設沒有 c 的靜態庫

硬鏈結與軟鏈結的簡單了解,靜態庫與動態庫的生成

硬鏈結 第3列的數叫硬鏈結數 有幾個檔名對應著同乙個inode,就叫硬鏈結數為幾 當前目錄.的inode和上一級目錄home下的admin是一樣的 硬鏈結好處 兩個檔名指向同乙個索引號,指向的資料是一樣的,此時day10.txt不小 心被刪掉了,引用計數 硬鏈結數 減少1 此時不為0 系統便知道還有...

軟鏈結 硬鏈結

硬鏈結與軟鏈結的聯絡與區別 我們知道檔案都有檔名與資料,這在 linux 上被分成兩個部分 元資料 metadata 是檔案的附加屬性,如檔案大小 建立時間 所有者等資訊。使用者資料 user data 即檔案資料塊 data block 資料塊是記錄檔案真實內容的地方 元資料則在 linux 中,...

軟鏈結 硬鏈結

硬鏈結就是同一塊資料但有兩個不同的名字,讀寫的時候本質上都是修改的同一塊資料。硬鏈結在刪除的時候只是刪除了乙個名字。只有一塊資料的所有名字都刪除了的時候,資料才會被刪除。刪除的時候相當於把牆的這一面糊上,但蘋果本身不動,只有兩面都糊上了,你才會看不到 符號鏈結就是 我聲稱我有乙個蘋果,但是當你找我要...