WINDOWS靜態庫與動態庫

2021-10-14 11:23:11 字數 3166 閱讀 3037

編譯靜態庫時,只會產生.lib檔案。所有資料都在lib檔案中。靜態庫的使用方式只有一種,即靜態載入,在程式編譯鏈結階段,會將靜態庫中的所有資料都鏈結合併到最終生成的exe檔案中,鏈結完成後就不再需要靜態庫檔案,這樣方便程式移植,但是也帶來程式臃腫過大的弊端。同時,如果靜態庫中函式有所變化,需要重新編譯工程來生成新的exe檔案,過程較為麻煩。

下面結合乙個具體的工程來做解釋。解決方案為testlibrary,testlibary目錄中內容如下:

資料夾testdll、testlib、usedll、uselib是四個工程的主目錄,分別用來生成動態庫生成靜態庫使用動態庫使用靜態庫,各個工程的輸出檔案路徑都設定為output

有兩個檔案testlib.htestlib.cpp

testlib.h內容:

// 注意:靜態庫匯出函式無需使用extern "c" __declspec(dllexport)修飾

void

testlibfunc1()

;void

testlibfunc2()

;

testlib.cpp內容:

#

include

"testlib.h"

#include

void

testlibfunc1()

void

testlibfunc2()

編譯後只生成testlib.lib檔案。

有兩個檔案testdll.htestdll.cpp

testdll.h內容:

// 注意:動態庫匯出函式一定要使用__declspec(dllexport)修飾

// 如果不使用__declspec(dllexport)進行修飾,

// 編譯時不會生成.lib檔案。

#define

export

__declspec

(dllexport)

export void

testdllfunc1()

;export void

testdllfunc2()

;

testdll.cpp內容:

#

include

"testdll.h"

#include

void

testdllfunc1()

void

testdllfunc2()

編譯後生成testdll.libtestdll.dll檔案。

均只有乙個檔案main.cpp用來呼叫庫中函式,其具體內容根據的載入方式有所不同。

靜態載入:在程式啟動時載入。

動態載入:在程式執行過程中通過呼叫庫函式實現載入庫。

因為靜態庫中所有資料在程式的編譯鏈結階段全部合併到exe檔案中,靜態庫就只有靜態載入一種載入方式。

靜態載入包括配置方式和**方式兩種方法。

此時main.cpp內容:

#

include

"testlib.h"

// #include "..\\testlib\\testlib.h" 未設定附加包含目錄時需要給出檔案路徑

intmain()

此時main.cpp內容:

#

include

"testlib.h"

// #include "..\\testlib\\testlib.h" 未設定附加包含目錄時需要給出檔案路徑

#pragma

comment

("lib"

,"testlib.lib"

)// pragma comment("lib", "..\\output\\testlib.lib") 未設定附加庫目錄時需要給出檔案路徑

intmain()

動態庫的實現部分在.dll檔案中,動態庫的載入方式包括靜態載入動態載入兩種方式。

動態庫的靜態載入跟靜態庫的靜態載入一樣,只有一點需要注意:需要將.dll檔案放到.exe檔案所在目錄下,exe檔案執行時只會在所在目錄搜尋dll檔案(動態載入也一樣)**,如果找不到會彈出系統錯誤提示框:由於找不到***, 無法繼續執行**,重新安裝程式可能會解決此問題。

動態庫的動態載入通過在**中呼叫相關庫函式實現,包括loadlibrary()getprocaddress()freelibrary()等。動態載入方式只需要使用.dll檔案,標頭檔案以及.lib檔案均不需要(注意這個區別)。

此時main.cpp內容:

#

include

typedef

int(

*funcaddr)()

;int

main()

return0;

}

此外,extern "c"的相關介紹可參考:extern c的思考。

靜態庫與動態庫

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 ...