模組定義檔案

模組定義 (.def) 檔案為連結器提供有關被連結程式的導出、屬性及其他方面的信息。生成 DLL 時,.def 檔案最有用。由於存在可代替模組定義語句使用的連結器選項,通常不需要 .def 檔案。也可以將 __declspec(dllexport) 用作指定導出函式的手段。在連結器階段可以使用 /DEF(指定模組定義檔案)連結器選項調用 .def 檔案。如果生成的 .exe 檔案沒有導出,使用 .def 檔案將使輸出檔案較大並降低載入速度。

基本介紹

  • 中文名:模組定義檔案
  • 外文名: (.def) 
  • 意義:提供有關被連結程式的導出
  • 位置VC++
通俗解釋,定義格式,

通俗解釋

VC++中,生成DLL可以不使用.def檔案。只需要在VC++的函式定義前要加__declspec(dllexport)修飾就可以了。但是使用__declspec(dllexport)和使用.def檔案是有區別的。如果DLL是提供給VC++用戶使用的,你只需要把編譯DLL時產生的.lib提供給用戶,它可以很輕鬆地調用你的DLL。但是如果你的DLL是供其他程式如VB、delphi,以及.NET用戶使用的,那么會產生一個小麻煩。因為VC++對於__declspec(dllexport)聲明的函式會對函式名尾附加函式在DLL中的地址,如下面的函式:
__declspec(dllexport) int __stdcallIsWinNT()
會轉換為IsWinNT@0,這樣你在VB中必須這樣聲明:
Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
@的後面的數由於參數類型不同而可能不同。這顯然不太方便。所以如果要想避免這種轉換,就要使用.def檔案方式。
EXPORTS後面的數可以不給,系統會自動分配一個數。對於VB、PB、Delphi用戶,通常使用按名稱進行調用的方式,這個數關係不大,但是對於使用.lib連結的VC程式來說,不是按名稱進行調用,而是按照這個數進行調用的,所以最好給出。
除了.def的解決方案外,還可以原樣編譯:
extern "C" int __declspec(dllexport) MyFunction();

定義格式

.def 檔案中的第一條 LIBRARY 語句不是必須的,但LIBRARY 語句後面的 DLL 的名稱必須正確,即與生成的動態程式庫的名稱必須匹配。此語句將 .def 檔案標識為屬於 DLL。連結器將此名稱放到 DLL 的導入庫中。
EXPORTS 語句列出名稱,可能的話還會列出 DLL 導出函式的序號值。通過在函式名的後面加上 @ 符和一個數字,給函式分配序號值。當指定序號值時,序號值的範圍必須是從 1 到 N,其中 N 是 DLL 導出函式的個數。
LIBRARY BTREE
EXPORTS
Insert @1
Delete @2
Member @3
Min @4
如果使用 MFC DLL 嚮導創建 MFC DLL,則嚮導將為您創建主幹 .def 檔案並將其自動添加到項目中。添加要導出到此檔案的函式名。對於非 MFC DLL,必須親自創建 .def 檔案並將其添加到項目中。
如果導出 C++ 檔案中的函式,必須將修飾名放到 .def 檔案中,或者通過使用外部“C”定義具有標準 C 連結的導出函式。如果需要將修飾名放到 .def 檔案中,則可以通過使用 DUMPBIN 工具或 /MAP 連結器選項來獲取修飾名。請注意,編譯器產生的修飾名是編譯器特定的。如果將 Visual C++ 編譯器產生的修飾名放到 .def 檔案中,則連結到 DLL 的應用程式必須也是用相同版本的 Visual C++ 生成的,這樣調用應用程式中的修飾名才能與 DLL 的 .def 檔案中的導出名相匹配。

相關詞條

熱門詞條

聯絡我們