靜態庫動態庫

2021-08-18 23:25:00 字數 1935 閱讀 5064

我們使用ls-l的時候看到的除了看到檔名,還看到檔案的元資料

擁有的許可權

硬鏈結數

檔案所有者

組 大小

檔案最後修改時間

檔名ls-l讀取儲存在磁碟上的檔案資訊,然後顯示出來

其實這個資訊除了通過這種方式來讀取,還有乙個sata命令能夠看到更多的資訊

這裡寫描述

上面的執行結果有幾個資訊需要解釋一下

inode

為了能解釋清楚inode我們先了解下檔案系統

這裡寫描述

超級塊:存放檔案系統本身的結構資訊。

i節點表:存放檔案屬性如檔案大小,所有者,最近修改時間等

資料區:存放檔案的內容

硬鏈結與軟連線

硬鏈結

我們由上面知道,真正找到磁碟檔案的並不是檔名,而是inode。其實在linux巨集可以讓多個檔名對應於同乙個inode。

touch abc

ln abc def

ls -li abc def

我們可以看到建立的這兩個檔案inode時一樣的,他們的鏈結狀態完全相同,他們被稱為指向檔案的硬鏈結。核心記錄了這個連線數。而我們在刪除檔案時乾了兩件事,1,在目錄中將對應的記錄刪除 2,將硬鏈結-1,如果為0,則將對應的磁碟釋放

軟連線

硬鏈結是通過inode引入另乙個檔案,軟連線是通過他的名字引用另乙個檔案,在shell中的做法是

adc

abc.s->abc

def

這裡寫描述

動態庫和靜態庫

靜態庫:程式在編譯連線的時候把庫的**鏈結到可執行檔案中。程式執行的時候不再需要靜態庫

動態庫:程式在執行的時候才去鏈結動態庫的**,多個程式共享使用靜態庫的**。

乙個與動態庫連線的可執行檔案僅僅包含它用到的函式入口位址的乙個表,而不是外部函式所在目標檔案的整個機器碼

在可執行檔案開始執行以前,外部函式的機器碼由作業系統從磁碟上的該動態庫中複製到記憶體中,這個過程稱為動態鏈結。

動態庫可以在多個程式間共享,所以動態鏈結使得可執行檔案更小,節省了磁碟空間。作業系統採用虛擬記憶體機制允許物理記憶體中的乙份動態庫被要用到該庫的所有程序公用,節省了記憶體和磁碟空間。

測試程式

/add.h/

int add(int a,int b);

/add.c/

int add(int a,int b)

/sub.h/

int sub(int a,int b);

int sub(int a,int b)

/main.c///

int main()

接下來我們就要生成靜態庫

在命令列輸入:gcc -c add.c -o add.o

gcc -c sub.c -o sub.o

//生成靜態庫

ar -rc libmymath.a add.o sub.o

//ar是gnu歸檔工具,rc表示(replace and creat)

接下來我們可以檢視靜態庫中的目錄列表

ar -tv libmymath.a

其中t:列出靜態庫中的檔案

v:詳細資訊

//我們在編譯的時候加上我們寫的靜態庫

gcc main.c -l. -lmymath

其中 -l 指定庫路徑

-l 指定庫名

測試目標檔案生成後,將靜態庫刪掉,程式照樣可以執行

生成動態庫

gcc -fpic -c sub.c add.c//產生位置無關碼

gcc -shared -o libmymath.so *.o//shared表示生成共享庫格式

執行動態庫

export ld_library_path=.

gcc main.c -lmymath

./a.out

靜態庫動態庫

靜態庫動態庫 靜態庫 是在執行程式之前就已經加入到執行 中,成為執行程式的一部分來執行的,字尾名 a 動態庫 是在執行程式啟動時載入到執行 中,字尾名 so 靜態庫和動態庫區別 動態庫編譯速度慢,執行速度快,但是生成的程式體積較大,占用記憶體,然而動態庫較易公升級,就布局而言,動態庫 不易布局,執行...

靜態庫 動態庫

學習程式設計,要對編譯鏈結過程了然如胸。在鏈結階段,有兩種鏈結方式 靜態鏈結和動態鏈結。兩者最大的區別在於鏈結的時機不一樣,靜態鏈結是在形成可執行程式前,而動態鏈結的進行則是在程式執行時,下面來詳細介紹這兩種鏈結方式。一 靜態鏈結 然後使用ar工具生成a庫,指令如下 ar命令詳細介紹可以參考這篇部落...

靜態庫,動態庫

我想多說關於程式編譯的一些規範和方法,一般來說,無論是c c 還是pas,首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的object file合成執行檔案,這個動作叫作鏈結 ...