文章目錄:
- 1.動态庫
-
- 1.1 分類
- 1.2 生成動态庫
- 1.3 使用
- 1.4 動态庫配合環境變量的使用
- 2. 靜态庫
-
- 2.1 分類
- 2.2 靜态庫的的生成
- 2.3 使用
- 3. 靜态連結和動态連結
- 4. 檔案系統(針對磁盤而言)
-
- 4.1 ext2檔案系統:
- 4.2 存儲資料的邏輯
- 4.3 擷取檔案的邏輯
- 5.軟硬連結
-
- 5.1 軟連接配接
- 5.2 硬連結
1.動态庫
1.1 分類
- windows下:字尾為.dll的檔案為動态庫
- linux下:字尾為.so,字首為lib的檔案為動态庫
1.2 生成動态庫
指令:gcc/g++
必選項的指令行參數:
- -shared==>生成動态庫
- -fPIC:生成與位置無關的代碼
指令範式:
gcc/g++ [source code] -shared -fPIC -o lib[動态庫名稱].so
1.3 使用
本質上是想要使用動态庫産生一個可執行程式;
gcc/g++ [source code] -o [可執行程式] -L [動态庫所在路徑] -l[動态庫的名稱]
測試如下:
我們首先寫一個頭檔案,裡面聲明一個print()函數
然後test.c中實作print()函數
接着我們将這個test.c編譯成一個動态庫
接着我們将test.c移出目前檔案夾,此時我們若想使用剛才寫的print()函數就得依賴libmytest.so,若我們直接運作main.c會發現找不到‘print’
而此時我們就可以運作test_main
- ldd+[可執行程式名稱]指令:檢視可執行程式依賴哪些動态庫
當我們将生成的動态庫libmytest.so移出目前檔案夾,我們會看到如下結果,test_main不能運作
1.4 動态庫配合環境變量的使用
如上圖所示,當我們将生成的動态庫libmytest.so移出目前檔案夾,會出現’not found’,且此時test_main也不能運作,那麼如何讓可執行程式能夠找到依賴的動态庫在哪呢?
解決方案:配合環境變量LD_LIBRARY_PATH進行使用
- LD_LIBRARY_PATH:動态庫的搜尋的環境變量
- PATH:可執行程式搜尋的環境變量
2. 靜态庫
2.1 分類
- windows下:字尾為.lib的檔案為動态庫
- linux下:字首為lib,字尾為.a的檔案為靜态庫
2.2 靜态庫的的生成
ar -rc lib[靜态庫名稱].a [依賴彙編完成之後的".o"檔案]
步驟:
- 1.先将要編譯靜态庫的代碼編譯到彙編為止,意味着
生産力.o檔案
- 2.ar -rc 生成靜态庫
2.3 使用
使用靜态庫編譯出一個可執行程式
gcc/g++ [source code] -o [可執行程式] -L [靜态庫所在路徑] -l[靜态庫的名稱]
注意:如果可執行程式依賴靜态庫進行編譯成功的,會将靜态庫的内容直接打包到可執行程式當中
如下圖所示使用ldd指令是看不到靜态庫的:
3. 靜态連結和動态連結
- 1.一個程式依賴動态庫或者依賴靜态庫生成可執行程式的時候,動态庫或者靜态庫是不會幹擾連結方式的(靜态連結和動态連結)
- 2.在編譯可執行程式,
反之,則為靜态連結
使用gcc/g++編譯的時候,預設不增加指令行參數"-static",則為動态連結。
4. 檔案系統(針對磁盤而言)
4.1 ext2檔案系統:
上圖為磁盤檔案系統圖(核心記憶體映像肯定有所不同),磁盤是典型的塊裝置,硬碟分區被劃分為一個個的block。一個block的大小是由格式化的時候确定的,并且不可以更改
- 超級塊(Super Block):存放檔案系統本身的結構資訊。記錄的資訊主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次挂載的時間,最近一次寫入資料的時間,最近一次檢驗磁盤的時間等其他檔案系統的相關資訊。Super Block的資訊被破壞,可以說整個檔案系統結構就被破壞了
- GDT,Group Descriptor Table:塊組描述符,描述塊組屬性資訊
- 塊位圖(Block Bitmap):描述每一個塊的使用情況,使用比特位為1,未使用比特位為0
- inode位圖(inode Bitmap):描述inode節點的使用情況,inode Bitmap描述inode table當中哪一個inode節點被使用,哪一個inode節點沒有被使用
- inode節點:就是用來描述檔案存儲的資訊,以及檔案的元資訊
4.2 存儲資料的邏輯
(1) 從block bitmap當中查找空閑的block塊,将檔案分成不同的塊存儲在不同的block當中
(2) 從inode bitmap當中查找空閑的inode節點,将檔案資訊儲存在inode當中,檔案資訊包含:檔案在那些block塊當中存儲的檔案名稱,檔案大小,檔案權限,檔案通路時間,檔案修改時間,檔案修改屬性時間,檔案的擁有者,檔案所屬組
(3)将檔案的名稱和inode節點号,作為目錄項儲存下來
4.3 擷取檔案的邏輯
(1)通過目錄項當中的檔案名稱找到對應的inode節點号
(2)通過inode節點号,找到對應的inode系欸但,再通過inode節點找到檔案的元資訊
(3)通過檔案元資訊,找到檔案存儲的block塊,将檔案内容組合起來
(4)展示給使用者,檔案的元資訊以及檔案内容
5.軟硬連結
5.1 軟連接配接
- 軟連接配接就是給檔案建立了一個快捷方式
如何建立一個軟連接配接
ln -s [原檔案] [要建立的軟連接配接檔案]
- 修改源檔案會影響軟連結檔案,修改軟連結檔案會影響源檔案
- 删除軟連接配接檔案,源檔案不會受到影響,但是删除源檔案的時候一定要把軟連接配接檔案也删除掉,不然會有如下圖所示情況
5.2 硬連結
- 硬連結相當于檔案的一個備份(拷貝)
如何建立一個硬連結檔案
- ln [源檔案] [硬連結檔案]
- 删除源檔案對硬連結檔案沒有影響