因為我們在寫代碼的時候,不可能每個代碼都要重新開始寫,我們可以使用別人寫好的,成熟的代碼,所以,庫的存在就變得非常有意義。linux的下的庫主要有倆種,一個是動態庫,一個是靜態庫。 1簡介 將一個程序編譯成可執行程序要經過預編譯,編譯,匯編,和鏈接這個幾個步驟,而動態庫和靜態庫的主要區別就是在鏈接階段怎么處理這些庫。 靜態庫在程序編譯的時候會被鏈接到目標文件當中,在程序運行的時候不在需要這些庫,程序移植方便,但是更新會很麻煩,可執行文件比較大,浪費空間,而動態庫在編譯的時候并不會鏈接到目標文件中去,所以程序在運行的時候還需要這些動態庫的存在。可執行程序比較小,但是程序在運行的過程中必須提供相應的庫。
2實驗操作 實驗一:靜態庫的制作和使用 實驗目標:制作一個靜態庫并使用。 實驗內容: 靜態庫的制作主要有以下幾個步驟: 1,生成目標文件。 2,使用ar命令創建靜態函數庫。 命名規則: 必須是lib[庫的名字].a,括號里面的為你的庫的名字,擴展名為.a 使用方法: 在使用gcc編譯的時候加上參數-L 和你的庫的路徑和你要鏈接的庫。 我們創建一個文本并輸入以下代碼。
1.jpg (8.3 KB, 下載次數: 36)
下載附件
2019-8-6 15:53 上傳
將這個文件放進ubuntu中。生成目標文件,輸入以下命令:
2.jpg (12.36 KB, 下載次數: 36)
下載附件
2019-8-6 15:53 上傳
輸入以下命令創建靜態庫, -c是創建的意思,-是替換的意思。
3.jpg (13.28 KB, 下載次數: 30)
下載附件
2019-8-6 15:53 上傳
在當前目錄創建一個文件輸入以下代碼:
4.jpg (8.31 KB, 下載次數: 29)
下載附件
2019-8-6 15:53 上傳
接著在ubuntu上編譯這個程序,編譯的時候鏈接我們上面那生成的庫,輸入以下命令:
5.jpg (22.22 KB, 下載次數: 35)
下載附件
2019-8-6 15:53 上傳
實驗二:動態庫的制作和使用 實驗目標:制作一個動態庫并使用。 實驗內容: 動態庫的制作主要有以下幾個步驟: 1,生成目標文件。 2,生成動態庫。 命名規則: lib[庫的名字].so,括號里面的為你的庫的名字,擴展名為.so 使用方法: 將生成的庫放在/usr/lib 或者 /lib下面去。 在實驗一的lib.c基礎上,輸入下圖命令,-fPIC表示與源碼位置無關,-shared 生成動態庫
6.jpg (15.05 KB, 下載次數: 37)
下載附件
2019-8-6 15:53 上傳
編譯test.c。輸入以下命令
7.jpg (15.38 KB, 下載次數: 37)
下載附件
2019-8-6 15:53 上傳
運行可執行文件test發現不可以運行成功,提示如下:
8.jpg (15.1 KB, 下載次數: 34)
下載附件
2019-8-6 15:53 上傳
因為Linux會默認在/usr/lib 或者 /lib下面找,但是我們的庫并不在這倆個路徑下面,我們將我們生成的庫拷貝到/usr/lib下面去,然后我們在運行我們程序。
9.jpg (9.58 KB, 下載次數: 35)
下載附件
2019-8-6 15:53 上傳
運行程序:
10.jpg (17.03 KB, 下載次數: 31)
下載附件
2019-8-6 15:53 上傳
3實驗分析 通過實驗我們可以發現,使用動態庫編譯生成的可執行文件要比靜態庫的要小。 使用動態庫:
11.jpg (38.6 KB, 下載次數: 30)
下載附件
2019-8-6 15:53 上傳
使用靜態庫:
12.jpg (31.83 KB, 下載次數: 45)
下載附件
2019-8-6 15:53 上傳
另外我們在編譯的時候參數-L 是用來指定庫的搜索路徑,-l是用來指定要鏈接的庫的名字.
13.jpg (29 KB, 下載次數: 37)
下載附件
2019-8-6 15:53 上傳
這個庫的名稱是什么,就是我們起的庫的名字,如下:
14.jpg (13.65 KB, 下載次數: 33)
下載附件
2019-8-6 15:53 上傳
開發利器:迅為IMX6開發板 新增ubuntu16,安卓6.0,新增Yocto,新增設備樹相關歷程
|