靜態庫和動態庫的建立

2021-07-11 21:50:17 字數 1839 閱讀 6133

最近學習了一下靜態庫和動態庫的建立,這裡是我學習後知道的建立方法,在這裡和大家分享以下,如果有不同意見或者更好的建議希望大家批評指正

首先我們先來說以下靜態庫和動態庫;

1.靜態庫:首先靜態庫的名字是以.s為字尾來命名的,靜態庫的作用是在函式的呼叫過程中將庫中的所有東西拷貝到目標**所在的檔案中,所以它的缺點是讓目標**所在的檔案占用記憶體大,還有如果靜態庫改變函式則必須重新來編譯才可以實現其改變後功能,但是它的優點就是不需要每次函式執行都對庫進行呼叫。

靜態庫的建立過程,首先靜態庫是由.o檔案建立而成的,比如我們現在先建立了乙個add.c用來實現乙個加法,有建立了乙個sub.c用來實現減法,他們分別**如下

現在先分別通過gcc -c sub.c sub.o和gcc -c add.c add.o生成sub.o 和add.o檔案;

生成該檔案之後我們建立靜態庫所用的命令時ar -cr libaddsub.s add.o sub.o; 我們可以看到ar是建立靜態庫所用的命令,而引數c 的意思是create即建立的意思,r的意思是replace即是如果原來有和libaddsub.s重名的庫現在就用當前所建立的庫來替代它,如果有的模組中有乙個模組不存在,則ar會提示錯誤訊息,ar顯示乙個錯誤的資訊,並不會替代其他同名的模組,預設情況下,新成員增加在庫的結尾處,可以使其他選項來改變增加的位置。 

到現在我們靜態庫已經建立成功了。

靜態庫的使用

命令 gcc -o main main.c -l. -laddsub編譯.

2.動態庫

動態庫是以.so為名字的字尾,它不會在函式呼叫是將其中所有的**都拷貝到目標檔案中,在每次函式執行時會調動動態庫,其優點是不會使目標檔案占用記憶體過多,而且庫的更改後你並不需要再次編譯程式來實現庫更改後對程式的改變(這個我們會在後邊通過程式來驗證),這樣庫的公升級會很方便所以動態庫會經常被多個程式一起應用,但是其確定是呼叫次數過多,目標檔案對庫的依賴性很大。

動態庫建立其命令是:gcc -fpic -shared -o libsubadd.so add.c sub.c  

其引數的含義為-fpic是生成與位置無關的**,-shared的意思是生成乙個共享庫。

對於動態庫的運用命令是: gcc -o main main.c -l. -laddsub (其中在使用庫的時候可以省去庫名中的字尾和前邊的lib);

現在我們來看一下這兩個庫的不同,我們所用的main.c**如下也是正常的加減,

當呼叫靜態庫後產生的可執行檔案main的結果是

我們知道靜態庫呼叫之後是將庫內的內容拷貝到了目標檔案中所以庫的更改對目標檔案的執行沒有影響,所以我們重點看下動態庫的使用

沒有更改庫之前呼叫動態庫後程式執行的結果和上面結果是相同的,現在我們將sub.c 中程式功能改為兩個數相加,將add.c中程式功能改為兩個數相減我們來看下更改後的程式

現在當我們刪除原來的庫建立乙個同名的庫的時候再去執行main可以看到結果如下

我們可以看到原來的5變為了15,15變成了-5但是我們並沒有再次編譯程式,所以動態庫對程式的更改是不需要再次對程式進行編譯的。

建立靜態庫和動態庫

今天是2014年5月25日。首先我想說一下在linux作業系統中,如何檢視程序和檢視程序樹。要想檢視程序只需敲入ps aux 即可,也可用 top指令,至於它倆的具體區別後面在介紹。用pstree 來檢視程序樹。這裡面有子程序和父程序,一定要會看。下來教你如何匯出核心資訊,和檢視映像。基於剛才的ps...

靜態庫和動態庫的建立

靜態庫的建立步驟 1 編輯要生成的庫檔案 vim add.c 在這裡實現a b的功能 2 將庫檔案編譯成目標檔案.ogcc c add.c o add.o 3 將目標檔案生成靜態庫ar rcs libadd.a add.o lib是字首,add.a是想要生成的靜態庫的名字 以上已經建立好了靜態庫。4...

linux建立靜態庫和動態庫

2015新年第一篇部落格,哈哈,這個2月還沒寫過部落格呢,從現在開始繼續!一 建立靜態庫 在本例中將建立乙個小型靜態函式庫libfoo,包含兩個函式bill fred 1 編輯兩個檔案bill.c和fred.c bill.c include void bill fred.c include void...