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 "xxx_dll"
EXPORTS
add PRIVAT