靜態庫和共享庫概念

2021-06-01 23:40:50 字數 963 閱讀 5245

1.靜態庫和共享庫的概念

在鏈結共享庫時只是指定了動態鏈結器和該程式所需要的庫檔案,並沒有真正的做鏈結,可執行檔案中仍然是未定義的符號,需要在執行時做動態鏈結。而在鏈結靜態庫時,鏈結器會把靜態庫中的目標檔案取出來和可執行檔案真正的鏈結在一起,所以採用靜態庫的可執行檔案一般很大,不需要庫檔案也能執行,而採用共享庫的可執行檔案一般比較小,需要庫檔案才能執行。

2.如何製作靜態庫和共享庫

(1)靜態庫製作

首先將原始檔編譯成目標檔案,製作靜態庫採用打包命令ar即可,例如:ar rs libname.a a.o b.o c.o,r表示將後面的檔案列表新增到檔案包,如果檔案包不存在就建立它,如果檔案包已有同名檔案就替換成新的,s是專用於生成靜態庫的,表示為靜態庫建立索引,這個索引被鏈結器使用。ranlib命令也可以為靜態庫建立索引,以上命令等價於:

ar r libname.a a.ob.o c.o

ranlib libname.a

(2)動態庫製作

組成共享庫的目標檔案和一般的目標檔案有所不同,在編譯時要加上-fpic選項,表示生成與位置無關**。採用gcc將目標檔案鏈結成共享庫,例如:

gcc –shared –olibname a.o b.o c.o

-shared專門用於生成共享庫的

3.應用程式怎麼編譯,怎麼鏈結

編譯器會首先找有沒有共享庫.so,如果有就鏈結它,如果沒有就找有沒有靜態庫,如果有就鏈結,所以編譯器優先考慮共享庫,如果希望編譯器只鏈結靜態庫,編譯時加上-static選項。

gcc –wall –l. –i. –lname–o hello hello.c

-l.表示共享庫有可能在當前目錄下,-i.表示頭檔案目錄有可能在當前目錄下,-lname表示共享庫的名字為libname.so,或者靜態庫的名字為libname.a,靜態鏈結是將庫檔案和目標檔案鏈結在一起的,所以在平台上不需要庫檔案就可以直接執行,而動態鏈結的還需要將共享庫拷貝到/usr/lib/下面,這樣應用程式才能執行。

靜態庫和共享庫

建立和使用靜態庫 1 建立目錄 mkdir p test sub 2 在子目錄sub 下編寫hello.c和hello.h hello.c include include hello.h void hello hello.h include void hello 4 在主目錄test 下編寫main...

靜態庫和共享庫(二)

brary值 2 動態鏈結緩衝檔案 etc ld.so.cache 3 目錄 lib,usr lib flag表示在什麼時候解決未定義的符號 呼叫 取值有兩個 1 rtld lazy 表明在動態鏈結庫的函式 執行時解決.2 rtld now 表明在dlopen返回前就解決所有未定義的符號,一旦未解決...

靜態庫和共享庫的區別

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