動態鏈結庫與靜態鏈結庫

2021-06-23 08:41:09 字數 1874 閱讀 7651

步驟:1.tools->options->projects and solutions->vc++ directories分別在包含檔案,庫檔案填加了路徑

(這些路徑只告訴編譯器怎麼找檔案,沒有說把那裡面的檔案加入工程.)

(若不設定,編譯報錯:無法開啟***檔案)

2.project->properties->c/c++->general->additional include directories 新增包含檔案

project->properties->linker->general->additional library directories 新增庫檔案

project->properties->linker->input->additional additional dependencies新增用到的lib

(這一步也可以在**中顯示呼叫 #pragma comment(lib, "***.lib") )

(若不新增,連線報錯:無法解析的外部符號)

3.將dll檔案拷貝到工程debug檔案下(如果不拷貝,編譯鏈結不報錯,執行報錯:無法找到***.dll)切記第三條,讓老子排查了一上午,當然最好把所有輸出目錄定位到乙個檔案下面。

附:

共有兩種庫:

一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊(入口),**由執行時載入在程序空間中的dll提供,稱為動態鏈結 庫dynamic link library。

一種是lib包含函式**本身,在編譯時直接將**加入程式當中,稱為靜態鏈結庫static link library。

共有兩種鏈結方式:

動態鏈結使用動態鏈結庫,允許可執行模組(.dll檔案或.exe檔案)僅包含在執行時定 位dll函式的可執行**所需的資訊。

靜態鏈結使用靜態鏈結庫,鏈結器從靜態鏈結庫lib獲取所有被引用函式,並將庫同**一起放到可執行檔案 中。

關於lib和dll的區別如下:

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

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

(3)動態鏈結的情況下,有兩個 檔案:乙個是lib檔案,乙個是dll檔案。lib包含被dll匯出的函式名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到dll 檔案。在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中相應函式**的位址,從而節省了記憶體資源。dll和lib檔案必須隨應用程式 一起發行,否則應用程式會產生錯誤。如果不想用lib檔案或者沒有lib檔案,可以用win32 api函式loadlibrary、getprocaddress裝載。

使用lib需注意兩個檔案:

(1).h標頭檔案,包含 lib中說明輸出的類或符號原型或資料結構。應用程式呼叫lib時,需要將該檔案包含入應用程式的原始檔中。

(2).lib檔案,略。

使 用dll需注意三個檔案:

(1).h標頭檔案,包含dll中說明輸出的類或符號原型或資料結構的.h檔案。應用程式呼叫dll時,需要將該檔案包含 入應用程式的原始檔中。

(2).lib檔案,是dll在編譯、鏈結成功之後生成的檔案,作用是當其他應用程式呼叫dll時,需要將該檔案引入應用 程式,否則產生錯誤。如果不想用lib檔案或者沒有lib檔案,可以用win32 api函式loadlibrary、getprocaddress裝載。

(3).dll檔案,真正的可執行檔案,開發成功後的應用 程式在發布時,只需要有.exe檔案和.dll檔案,並不需要.lib檔案和.h標頭檔案

動態鏈結庫與靜態鏈結庫

有人會想,動態鏈結這樣麻煩,為什麼還要用呢?這裡有乙個技術問題,對這個問題的解決直接導致了動態載入的需求。問題是有些dll只在某個windows版本中存在,或某個api只在某些windows版本中被加入指定的dll。當你使用靜態鏈結的.exe試圖在不支援的windows版本上執行時,系統會彈出系統對...

動態鏈結庫與靜態鏈結庫

原貼出處 http blog.csdn.net benny5609 archive 2008 04 17 2298998.aspxs 還有參考 http msdn.microsoft.com zh cn library 1ez7dh12 v vs.100 aspxs 首先通過乙個簡單的靜態鏈結庫的例...

靜態鏈結 庫 與動態鏈結 庫

靜態鏈結與動態鏈結 簡單的說,靜態庫和應用程式編譯在一起,在任何情況下都能執行,而動態庫是動態鏈結,顧名思義就是在應用程式啟動的時候才會鏈結,所以,當使用者的系統上沒有該動態庫時,應用程式就會執行失敗。再看它們的特點 動態庫 1.共享 多個應用程式可以使用同乙個動態庫,啟動多個應用程式的時候,只需要...