共用庫和靜態庫的製作

2020-08-11 21:15:25

庫的建立

靜態庫:

庫是一組預先編譯好的函數的集合,這些函數都是按照可重用的原則編寫的。它們通常由一組相互關聯的函陣列成來執行某項常見的任務,
標準庫的位置一般存放在/lib和/user/lib目錄中。
庫的命名規則名字總是以lib開頭以.a或者.so結尾,其中以.a結尾的代表傳統的靜態函數庫,而以.so結尾的代表共用函數庫庫函數通常以靜態庫和共用庫的形式存在,我們可以用ls /usr/lib命令檢視,例子:gcc -o main main.c /usr/lib/libm.a這個命令的含義是讓我們編譯一個名叫main.c的檔案,將編譯好的檔案以main命名,同時在編譯時我們不但要存取標準c語言庫,還要存取數學庫來解決。也可以寫成gcc -o main main.c -lm
靜態庫:將.c檔案處理成.o檔案
在这里插入图片描述
將.o檔案新增到庫裏面ar c(建立)r(新增)v(顯示過程).例如:ar crv libm.a add.o sum.o,
將add.o,sum.o新增到libfoo.a中
在这里插入图片描述
編譯檔案時,必須要在後面加上路徑以-L開頭 ,後面是需要的庫以-l開頭,值得注意的是l後面的庫名是不要字首(lib)和後綴(.a)的,否則會出錯
在这里插入图片描述
將方法移動到標準目錄底下,我們可以不加路徑執行成功,系統會自動存取標準庫
在这里插入图片描述
在这里插入图片描述

共用庫

共用庫的建立是以gcc來建立的,例如:gcc -shared -fpic -o libfoo.so add.o max.o。這裏將add.o換成add.c也會執行成功,系統會幫我們處理,但是筆者在這裏想說明方法是以.o的形式新增到共用庫中的。
在这里插入图片描述
當我們準備編譯時,出現了錯誤,系統提示我們沒有找到這個庫。是不是很困惑?明明在後面加了路徑,這是因爲我們沒有將libfoo.so共用庫移動到標準目錄底下。此時我們可以通過一個叫lld的命令來檢視我們編譯main.c時所需要的庫,此時我們看到libfoo.so => mot found,提示我們沒有找到這個庫,這時我們將共用庫移動到標準庫,就能執行成功了,因爲系統已經在標準庫中找到了libfoo.so共用庫。編譯好後我們再執行main時,不用再後面加路徑了,因爲main函數已經鏈接到了共用庫的位置。在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

共用庫和靜態庫的區別

靜態庫所需要的庫刪除以後程式碼還能執行,因爲在程式碼中已經將靜態庫方法拷貝過來。
共用庫不會包含,它只是執行時進行鏈接,如果刪除的話,會執行失敗
在这里插入图片描述