msdn中的名詞解釋
模組定義 (.def) 檔案為鏈結器提供有關被鏈結程式的匯出、屬性及其他方面的資訊。生成 dll 時,.def檔案最有用。由於存在可代替模組定義語句使用的
鏈結器選項
,通常不需要 .def 檔案。也可以將
__declspec(dllexport)
用作指定匯出函式的手段。在鏈結器階段可以使用
/def(指定模組定義檔案)
鏈結器選項呼叫 .def 檔案。
如果生成的 .exe 檔案沒有匯出,使用 .def 檔案將使輸出檔案較大並降低載入速度。
通俗解釋
在vc++中,生成dll可以不使用.def檔案。只需要在vc++的函式定義前要加__declspec(dllexport)修飾就可以了。但是使用__declspec(dllexport)和使用.def檔案是有區別的。如果dll是提供給vc++使用者使用的,你只需要把編譯dll時產生的.lib提供給使用者,它可以很輕鬆地呼叫你的dll。但是如果你的dll是供其他程式如vb、delphi,以及.net
使用者使用的,那麼會產生乙個小麻煩。因為vc++對於__declspec(dllexport)宣告的函式會進行名稱轉換,如下面的函式:
__declspec(dllexport) int __stdcall iswinnt()
會轉換為iswinnt@0,這樣你在vb中必須這樣宣告:
declare function iswinnt lib "my.dll" alias "iswinnt@0" () as long
@的後面的數由於引數型別不同而可能不同。這顯然不太方便。所以如果要想避免這種轉換,就要使用.def檔案方式。
exports後面的數可以不給,系統會自動分配乙個數。對於vb、pb、delphi使用者,通常使用按名稱進行呼叫的方式,這個數關係不大,但是對於使用.lib鏈結的vc程式來說,不是按名稱進行呼叫,而是按照這個數進行呼叫的,所以最好給出。
例子:我們用vc6.0製作乙個dll,不使用.def檔案,在標頭檔案中這樣寫
#ifndef lib_h
#define lib_h
extern "c" int _declspec(dllexport)add(int x,int y);
#endif
如果是.def檔案,可以這樣
library "***_dll"
exports
add privat
模組定義 def 檔案說明
msdn中的名詞解釋 模組定義 def 檔案為鏈結器提供有關被鏈結程式的匯出 屬性及其他方面的資訊。生成 dll 時,def 檔案最有用。由於存在可代替模組定義語句使用的 鏈結器選項 通常不需要 def 檔案。也可以將 declspec dllexport 用作指定匯出函式的手段。在鏈結器階段可以使...
DLL的模組定義檔案( DEF)
動態連線庫函式或者成員的匯出可以用 declspec dllexport 來實現,比如為了匯出void sayhello 函式,則在dll檔案中這麼宣告 或者定義 declspec dllexport void sayhello 也可以不用 declspec dllexport 而採用.def檔案來...
vs2008中的模組定義檔案( def)
一般用來定義dll匯出函式等!1.在什麼情況下需要使用.def的模組定義檔案?使用 stdcall導處函式的時候需要使用.def的模組定義檔案,使用 declspec dllexport 導處函式不需要使用.def檔案。2.定義的.def檔案新增進工程後無效?在 屬性 聯結器 輸入 模組定義檔案 進...