靜態庫和共享庫 動態庫 的區別

2021-09-09 06:16:17 字數 1311 閱讀 3477

靜態庫和共享庫(動態庫)的區別

根據鏈結時期不同,分為靜態庫和共享庫,靜態庫是在程式編譯時鏈結的,共享庫是在程式執行時鏈結的。

庫是預先編譯好的方法的集合,命名一般為libxx.a(靜態庫)libxx.so(動態庫),庫檔案常存放的地點為/lib或/usr/lib,庫對應的標頭檔案一般存放在/usr/include中

add.c

int add(int a,int b)

max.c
int max(int a,int b)

main.c
#includeint add(int a,int b);

int max(int a,int b)

int main()

1、靜態庫的生成

兩種方法int add(int a,int b),int max(int a,int b)分別在兩個檔案add.c和max.c中存放,靜態庫的生成過程如下

1):將所有的.c檔案編譯成.o目標檔案

gcc -c add.c 生成add.o

gcc -c max.c 生成max.o

2) : 對生成的.o目標檔案打包生成靜態庫

ar crv libfoo.a add.o max.o 是庫的名字

ar:做庫的命令

c:建立庫

r:將方法新增到庫里

v:顯示過程,可以不要

3):使用靜態庫

gcc -o main main.c -l. -lfoo //這裡寫的foo是去掉前字尾後庫的名字

-l:指定路徑 .代表當前路徑

-l:指定庫名

2 、共享庫的生成

1)將所有的.c檔案編譯成.o目標檔案

gcc -c max.c

gcc -c add.c

2) 對生成的.o檔案處理生成共享庫,共享庫的名字為libfoo.so

gcc -shared -fpic -o libfoo.so add.o max.o

-shared 表示輸出結果是共享庫型別的

-fpic 表示使用位址無關**(position independent code)技術來生產輸出檔案

3)庫的使用

gcc -o main main.c -lfoo

cp libfoo.so /usr/lib

3、小結:

靜態庫包含了目標**即.o檔案,不利於磁碟,空間的使用,造成系統空間的浪費

共享庫由於在程式執行時鏈結,所以執行速度稍低

程式在鏈結時,一般優先鏈結共享庫,除非用static引數指定鏈結靜態庫

靜態庫和共享庫的區別

根據鏈結時期不同,庫分為靜態庫和動態庫。靜態庫是在程式編譯時鏈結的,動態庫是在程式執行時鏈結的。庫是預先編譯好的方法的集合 linux上庫的命名一般為lib a 靜態庫 lib so 動態庫 庫檔案常存放的地點為 lib或 usr lib,庫對應的標頭檔案一般存放在 usr include中 下面介...

靜態庫和動態庫的區別

windows vc 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 2 設定lib檔案允許編譯器去查詢已經編譯好的...

靜態庫和動態庫的區別

靜態庫在程式編譯時被連線到目標 中,程式執行時不再需要靜態庫 動態庫在編譯時並不被連線到目標 中,而是程式執行時才被載入,執行時仍然需要動態庫存在。靜態庫的命名規範是以 lib為字首,緊接著是靜態庫名,副檔名是.a 先將檔案編譯成 o 檔案然後是編譯成靜態檔案 動態庫檔案在檔名前加 lib字首,擴充...