使用 .DEF 檔從 DLL 匯出

模組定義或 DEF 檔案 (*.def) 是一個文字檔,其中包含一或多個模組語句,描述 DLL 的各種屬性。 如果您未使用 __declspec(dllexport) 關鍵字匯出 DLL 的函式,DLL 需要 DEF 檔案。

最小 DEF 檔案必須包含下列模組定義語句:

  • 檔案中的第一個語句必須是 LIBRARY 語句。 此語句會將 DEF 檔案識別為屬於 DLL。 LIBRARY 語句後面接著 DLL 的名稱。 連結器會將這個名稱放在 DLL 的匯入程式庫中。

  • EXPORT 語句會列出 DLL 所匯出之函式的名稱,並選擇性地列出序數值。 您可以依照函式的名稱加上符號 (@) 和數位來指派序數值。 當您指定序數值時,它們必須介於範圍 1 到 N 中,其中 N 是 DLL 匯出的函式數目。 如果您想要依序數匯出函式,請參閱 依序數從 DLL 匯出函式,而不是依名稱 匯出函式,以及本主題。

例如,包含實作二進位搜尋樹狀結構之程式碼的 DLL 可能如下所示:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

如果您使用 MFC DLL 精靈 來建立 MFC DLL,精靈會為您建立基本架構 DEF 檔案,並自動將它新增至您的專案。 新增要匯出至此檔案的函式名稱。 針對非 MFC DLL,請自行建立 DEF 檔案,並將它新增至您的專案。 然後移至 [專案 > 屬性 > ] 連結器 > 輸入 > 模組定義檔 ,然後輸入 DEF 檔案的名稱。 針對每個組態和平臺重複此步驟,或選取 [組態 = 所有 組態] 和 [平臺 = 所有平臺 ] 來一次執行此步驟。

如果您要在 C++ 檔案中匯出函式,則必須將裝飾名稱放在 DEF 檔案中,或使用 extern 「C」 來定義匯出的函式與標準 C 連結。 如果您需要將裝飾名稱放在 DEF 檔案中,您可以使用 DUMPBIN 工具或使用連結器 /MAP 選項來取得它們 。 請注意,編譯器所產生的裝飾名稱是編譯器特定的。 如果您將 Microsoft C++ 編譯器 (MSVC) 所產生的裝飾名稱放入 DEF 檔案中,則連結至 DLL 的應用程式也必須使用相同的 MSVC 版本來建置,讓呼叫應用程式中的裝飾名稱符合 DLL DEF 檔案中匯出的名稱。

注意

使用 Visual Studio 2015 建置的 DLL 可由使用 Visual Studio 2017 或 Visual Studio 2019 建置的應用程式取用。

如果您要建置 擴充 DLL 並使用 DEF 檔案進行匯出,請將下列程式碼放在包含匯出類別的標頭檔開頭和結尾:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

這幾行可確保在內部使用或新增至類別的 MFC 變數會從 MFC 擴充功能 DLL 匯出(或匯入)。 例如,使用 DECLARE_DYNAMIC 衍生類別時,宏會展開以將成員變數新增 CRuntimeClass 至類別。 排除這四行可能會導致 DLL 編譯或連結不正確,或在用戶端應用程式連結至 DLL 時造成錯誤。

建置 DLL 時,連結器會使用 DEF 檔案來建立匯出 (.exp) 檔案和匯入程式庫 (.lib) 檔案。 連結器接著會使用匯出檔案來建置 DLL 檔案。 建置時隱含連結至匯入程式庫之 DLL 連結的可執行檔。

請注意,MFC 本身會使用 DEF 檔案,從 MFCx0.dll 匯出函式和類別。

您想要做什麼事?

您還想知道關於哪些方面的詳細資訊?

另請參閱

從 DLL 匯出