文章目錄:
- 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 [源檔案] [硬鏈接檔案]
- 洗掉源檔案對硬鏈接檔案沒有影響
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276304.html
標籤:其他
上一篇:Linux-行程等待的非阻塞模式-行程程式替換-minishell
下一篇:LVM邏輯卷管理





