Visual Stdio 動態庫的生成

2021-06-21 05:58:26 字數 2258 閱讀 1801

vs 下面生成動態庫時,只需要在專案嚮導中最後一步選擇是生成dll檔案或者在建立專案後在專案->屬性中設定生成的屬性為dll。

關鍵是如何使用生成的dll。vs在生成dll時預設是不生成對應的導入庫lib的。需要自己定義需要匯入的函式。檔案型別為.def。

.def的新增方式為專案屬性-->聯結器-->輸入-->模組定義檔案,輸入source.def。

msdn上的介紹

網上的資料:

1.dll宣告匯出函式

dll中匯出函式的宣告有兩種方式:一種為在函式宣告中加上__declspec(dllexport);另外一種方式是採用模組定義(.def) 檔案宣告,.def檔案為鏈結器提供了有關被鏈結程式的匯出、屬性及其他方面的資訊。

1)函式宣告方式

#ifndef lib_h

#define lib_h

extern "c" int _declspec(dllexport) add(int x,int y);

#endif

函式實現

#include "add.h"

int add(int a, int b)

在另乙個專案中引用項剛才生成的dll.當動態呼叫時,不需要加入函式頭,因為是有編譯器去dll可執行檔案的符號表裡面找有沒有對應的函式。此時奇怪的是要用loadlibrarya,可以找到,但是用loadlibrary卻返回是null,不知道是問什麼?還有就是windows下程式設計是檔案路徑可以用兩種方式:

1. f:/vs 2010 projects/dll1/main/debug/dll1.dll
2. f:\\vs 2010 projects\\dll1\\main\\debug\\dll1.dll
但是不支援單獨使用 \ 來分割路徑,因為 \ 被處理時認為是轉義字元。

#include #include typedef int(*addfunc)(int, int);

int main()

else

freelibrary(hdll);

} return 0;

}

dll的動態呼叫

由「loadlibrary-getprocaddress-freelibrary」系統api提供的三位一體「dll載入-dll函式位址獲取-dll釋放」方式.動態呼叫方式的特點是完全由程式設計者用 api 函式載入和解除安裝 dll,程式設計師可以決定 dll 檔案何時載入或不載入,顯式鏈結在執行時決定載入哪個 dll 檔案。動態呼叫方式相比靜態呼叫,較複雜,但能更加有效地使用記憶體,是編制大型應用程式的重要方式。(

可以手動的釋放載入到記憶體的動態庫,提高記憶體利用率)

2)def方式

library dll1

exports

add

函式宣告,宣告為外部函式。

#ifndef add_h

#define add_h

extern "c" int add(int x, int y);

#endif

靜態方式載入動態庫。

#include #include "../dll1/add.h"

#pragma comment(lib,"..\\debug\\dll1.lib")

int main()

靜態呼叫採用#pragma comment(lib,"..\\debug\\dll1.lib")方式匯入。

靜態呼叫方式的特點是由編譯系統完成對dll的載入和應用程式結束時 dll 的解除安裝。當呼叫某dll的應用程式結束時,若系統中還有其它程式使用該 dll,則windows對dll的應用記錄減1,直到所有使用該dll的程式都結束時才釋放它。靜態呼叫方式簡單實用,但不如動態呼叫方式靈活。

靜態呼叫方式不再需要使用系統api來載入、解除安裝dll以及獲取dll中匯出函式的位址。這是因為,當程式設計師通過靜態鏈結方式編譯生成應用程式時,應用程式中呼叫的與.lib檔案中匯出符號相匹配的函式符號將進入到生成的exe 檔案中,.lib檔案中所包含的與之對應的dll檔案的檔名也被編譯器儲存在 exe檔案內部。當應用程式執行過程中需要載入dll檔案時,windows將根據這些資訊發現並載入dll,然後通過符號名實現對dll 函式的動態鏈結。這樣,exe將能直接通過函式名呼叫dll的輸出函式,就象呼叫程式內部的其他函式一樣。 

動態呼叫動態庫的方法

假定動態庫提供乙個引出函式為int func int n extern c typedef int stdcall pfunc int n 引進函式,並定義為函式指標 hmodule hmodule getmodulehandle dll 檢查動態庫是否已經載入 if hmodule null hm...

動態庫專題 靜態庫和動態庫

linux中有兩類函式庫,分別是靜態庫和動態庫。靜態函式庫 這類庫的名字一般是lib a 利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為...

動態載入動態庫

message函式的宣告你應該知道吧,把它的宣告和下面的語句寫到乙個標頭檔案中 pragma comment lib,a.lib 然後你的對話方塊.cpp中包含這個標頭檔案就可以使用message函式了。如果dll沒有對應的.lib檔案,那麼就只能使用動態載入的方式了。動態呼叫動態庫步驟 1 建立乙...