C++: 模塊定義文件聲明(.def)的使用
分類專欄: C-C++
版權
1. 概念
dll中有兩種導出函數聲明的方式:①__declspec(dllexport);②模塊定義文件(.def)
其中,.def文件為鏈接器提供有關被鏈接程序的導出、屬性及其他方面的信息。
2. .def的使用方式
(1).def文件的規則為:
LIBRARY語句:說明.def文件相應的DLL;
EXPORTS語句:在其后要列出導出函數的名稱。可以在.def文件中的導出函數名后加@n,表示要導出函數的序號為n(在進行函數調用時,這個序號將發揮其作用);
【注】:.def 文件中的注釋由每個注釋行開始處的分號 (;) 指定,且注釋不能與語句共享一行。
(2)使用
如果想導出 C++ 文件中的函數,則必須將修飾名放到 .def 文件中,或者通過使用外部“C”定義具有標准 C 鏈接的導出函數。
如果需要將修飾名放到 .def 文件中,則可以通過使用 DUMPBIN 工具或 /MAP 鏈接器選項來獲取修飾名。
請注意,編譯器產生的修飾名是編譯器特定的。
如果將 Visual C++ 編譯器產生的修飾名放到 .def 文件中,則鏈接到 DLL 的應用程序必須也是用相同版本的 Visual C++ 生成的,這樣調用應用程序中的修飾名才能與 DLL 的 .def 文件中的導出名相匹配。
如果生成擴展 DLL 並使用 .def 文件導出,則將下列代碼放在包含導出類的頭文件的開頭和結尾:
#undef AFX_DATA#define AFX_DATA AFX_EXT_DATA// <body of your header file>#undef AFX_DATA#define AFX_DATA這些代碼行確保內部使用的 MFC 變量或添加到類的變量是從擴展 DLL 導出(或導入)的。例如,當使用 DECLARE_DYNAMIC 派生類時,該宏擴展以將 CRuntimeClass 成員變量添加到類。省去這四行代碼可能會導致不能正確編譯或鏈接 DLL,或在客戶端應用程序鏈接到 DLL 時導致錯誤。
當生成 DLL 時,鏈接器使用 .def 文件創建導出 (.exp) 文件和導入庫 (.lib) 文件。
然后,鏈接器使用導出文件生成 DLL 文件。隱式鏈接到 DLL 的可執行文件在生成時鏈接到導入庫。
參考文章