靜態庫與動態庫使用01

2021-10-19 21:17:09 字數 1194 閱讀 3563

lib和dll的區別

靜態庫:在鏈結步驟中,聯結器將從庫檔案取得所需的**,複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫**的乙份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的 exe 檔案中了。在vs中新建生成靜態庫的工程,編譯生成成功後,只產生乙個.lib檔案

動態庫:動態鏈結庫是乙個包含可由多個程式同時使用的**和資料的庫,dll不是可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個 dll 中,該 dll 包含乙個或多個已被編譯、鏈結並與使用它們的程序分開儲存的函式。在vs中新建生成動態庫的工程,編譯成功後,產生乙個.lib檔案和乙個.dll檔案

關於lib和dll的區別如下:

(1)lib是編譯時用到的,dll是執行時用到的。如果要完成源**的/font編譯,只需要lib;如果要使動態鏈結的程式執行起來,只需要dll。

(2)如果有dll檔案,那麼lib一般是一些索引資訊,記錄了dll中函式的入口和位置,dll中是函式的具體內容;如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib檔案,在執行程式時不需要再掛動態庫,缺點是導致應用程式比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程式才行。

(3)動態鏈結的情況下,有兩個檔案:乙個是lib檔案,乙個是dll檔案。lib包含被dll匯出的函式名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到dll檔案。在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中相應函式**的位址,從而節省了記憶體資源。dll是執行時用到的。如果要完成源**的編譯,只需要lib. 通常伺服器編譯的時候需要用到lib和標頭檔案,而發行的時候一般只需要dll就可以了。

呼叫動態庫

有兩種方法呼叫動態庫,一種隱式鏈結,一種顯示鏈結。

隱式鏈結 需要.**件,dll檔案,lib檔案

(1)將dll放到工程的工作目錄

(2)設定專案屬性–vc++目錄–庫目錄為lib所在的路徑

(4)在原始檔中新增.h標頭檔案

然後就像平常一樣呼叫普通函式、類、變數

顯示鏈結 只需要.dll檔案

顯示呼叫主要使用win32 api函式loadlibrary、getprocaddress

靜態庫與動態庫

linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...

靜態庫與動態庫

庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...

靜態庫與動態庫

1.靜態庫 工程在呼叫靜態庫時,複製靜態庫,源 加長,不節省程式空間。字尾名.a 優點 程式設計後不需要再依賴庫 以空間換時間 建立靜態庫 gcc c 原始檔.c ar rcs rcu 靜態庫名 目標檔案1 目標檔案2 rc 靜態庫不存在,就建立該庫檔案 s 更新靜態庫 使用 gcc o file ...