如何使用GCC生成動態庫和靜態庫

2022-06-07 12:36:13 字數 1571 閱讀 3768

根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執行程式中了,這樣系統空間有很大的浪費,而且一旦發現系統中有bug,就必須一一把鏈結該庫的程式找出來,然後重新編譯,十分麻煩。而動態庫剛好彌補了這個缺陷,因為動態庫是在程式執行時被鏈結的,所以磁碟上只需保留乙份副本,一次節約了空間,如果發現bug或者是要公升級,只要用新的庫把原來的替換掉就可以了。靜態庫是不是一無是處了呢?非也。如果**在其他系統上執行,且沒有相應的庫時,解決辦法就是使用靜態庫。而且由於動態庫是在程式執行的時候被鏈結,因此動態庫的執行速度比較慢。

好了,我們了解了關於動態庫和靜態庫的相關知識,那麼如何使用gcc生成靜態庫和動態庫呢?

程式清單如下:

test.c

int add(int a,int b)

int sub(int a,int b)

int mul(int a,int b)

int div(int a,int b)

test.h

#ifndef _test_h_

#define _test_h_

extern int add(int a,int b);

extern int sub(int a,int b);

extern int mul(int a,int b);

extern int div(int a,int b);

main.c

#include#includeint main()

在此例中,test.c用於編譯生成靜態庫libtest.a,test.h為libtest.a對應的標頭檔案。

第一步:生成test.o目標檔案,使用gcc -c test.c -o test.o命令。

第二步:使用ar將test.o打包成libtest.a靜態庫,使用ar rcs -o libtest.a test.o命令

第三步:生成libtest.a靜態庫後,可以使用命令ar t libtest.a檢視libtest.a檔案中包含哪些檔案。

第一步:生成test.o目標檔案,使用如下命令。在此處需要新增-fpic引數,該引數用於生成位置無關**以供生成動態庫使用,使用命令:gcc -c -o test.o -fpic test.c

第二步:使用-shared引數生成動態庫,使用如下命令:gcc -shared -o libmyshare.so test.o,上述兩個命令可以連在一起,如下所示:gcc -shared -fpic -o libmyshare.so test.c

如何使用GCC生成動態庫和靜態庫

根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執...

如何使用GCC生成動態庫和靜態庫

根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執...

C 如何使用GCC生成動態庫和靜態庫

一.靜態庫和動態庫的定義及區別 程式編譯的四個過程 1.預處理 展開標頭檔案 巨集替換 去掉注釋 條件編譯 i字尾 2.編譯 檢查語法,生成彙編 s字尾 3.彙編 彙編 轉換成機器 o字尾 4.鏈結 鏈結到一起生成可執行程式 out字尾 靜態庫 靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受...