共享庫和靜態庫的製作

2021-10-09 02:34:05 字數 1497 閱讀 7368

庫是一組預先編譯好的函式的集合,這些函式都是按照可重用的原則編寫的。它們通常由一組相互關聯的函式組成來執行某項常見的任務,

標準庫的位置一般存放在/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函式已經鏈結到了共享庫的位置。

靜態庫所需要的庫刪除以後**還能執行,因為在**中已經將靜態庫方法拷貝過來。

共享庫不會包含,它只是執行時進行鏈結,如果刪除的話,會執行失敗

共享庫和靜態庫

1.什麼是庫 在windows平台和linux平台下都大量存在著庫。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。由於windows和linux的本質不同,因此二者庫的二進位制是不相容的。本文僅限於介紹linux下的庫。2.庫的種類 linux下的庫有兩種 靜態庫和共享庫 ...

建立C共享庫和靜態庫

操作環境,linux系統下。sth.c 庫程式 unsigned long long sth unsigned int x,unsigned int y 建立主函式呼叫fuction.c test.c include includeint main int argc,char argv gcc c ...

linux下的共享庫(動態庫)和靜態庫

linux下的共享庫 動態庫 和靜態庫 1.什麼是庫 在windows平台和linux平台下都大量存在著庫。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。由於windows和linux的本質不同,因此二者庫的二進位制是不相容的。本文僅限於介紹linux下的庫。2.庫的種類 ...