1. 程式人生 > >C++: 模組定義檔案宣告(.def)的使用

C++: 模組定義檔案宣告(.def)的使用

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 的可執行檔案在生成時連結到匯入庫。

參考文章

1. https://blog.csdn.net/sky04/article/details/5410065

2. https://blog.csdn.net/qianpeng4/article/details/76474831