1. 程式人生 > >VS中def檔案對於生成dll和lib檔案的作用

VS中def檔案對於生成dll和lib檔案的作用

把 sqlite3.def 新增到工程中.

選擇工程 > 屬性中的連結器,然後找到"輸入"這一項. 在 "模組定義檔案" 中輸入  sqlite3.def

注意: 你需要在 Debug 和 Release 中都輸入該項才行.

一、 __declspec(dllexport)
在 32 位編譯器版本中,可以使用 __declspec(dllexport) 關鍵字從 DLL 匯出資料、函式、類或類成員函式。__declspec(dllexport) 在link時會將匯出指令新增到obj檔案中,因此不需要使用 .def 檔案。當然,即使用了__declspec(dllexport)依然可以使用*.def檔案,因為不同編譯器對於類的成員函式的name mangling規則不同,可以定義.def檔案通過序號呼叫。為每個dll寫def顯得很繁雜,目前def使用已經比較少了,更多的是使用 __declspec(dllexport)在原始碼中定義dll的輸出函式。

若要輸出類的所有成員:資料or函式,__declspec(dllexport)要放在類名左邊宣告:
class __declspec(dllexport) Class1{}
如果類沒有資料成員,__declspec(dllexport)放在class 關鍵字前宣告就會被編譯器忽略,就沒有lib生成,如下:
__declspec(dllexport) class Class1{}


使用 __declspec(dllexport) 的優缺點(zz)
使用 __declspec(dllexport) 非常方便,因為不必考慮維護 .def 檔案和獲取匯出函式的修飾名。例如,如果您設計的 DLL 供自己控制的應用程式使用,則此方法很適用。如果通過新的匯出函式重新生成 DLL,還必須重新生成應用程式,因為如果使用不同版本的編譯器進行重新編譯,則匯出的 C++ 函式的修飾名可能會發生變化。

二、def檔案
其實def檔案的功能相當於extern “C” __declspec(dllexport)

def檔案中PRIVTATE的作用

The optional keyword PRIVATE prevents entryname from being placed in the import library generated by LINK. It has no
effect on the export in the image also generated by LINK.用了PRIVATE,生成的lib裡沒有對應方法或者資料的entryname因此不能被客戶隱式呼叫。

使用 .DEF 檔案的優缺點(zz)
在 .def 檔案中匯出函式使您得以控制匯出序號。當將附加的匯出函式新增到 DLL 時,可以給它們分配更高的序號值(高於任何其他匯出函式)。當您進行此操作時,使用隱式連結的應用程式不必與包含新函式的新匯入庫重新連結。這非常重要,例如,在設計將由許多應用程式使用的第三方DLL 時。可以通過新增附加功能不斷地增強 DLL,同時確保現有應用程式繼續正常使用新的 DLL。MFC DLL 是使用 .def 檔案生成的。

使用 .def 檔案的另一個優點是:可以使用 NONAME 屬性匯出函式,該屬性僅將序號放到 DLL 的匯出表中。對具有大量匯出函式的 DLL,使用NONAME 屬性可以減小 DLL 檔案的大小。有關編寫模組定義語句的資訊,請參見模組定義語句的規則。有關序號匯出的更多資訊,請參見按序號而不是按名稱從 DLL 匯出函式。

使用 .def 檔案的主要缺點是:在 C++ 檔案中匯出函式時,必須將修飾名放到 .def 檔案中,或者通過使用外部“C”用標準 C 連結定義匯出函式,以避免編譯器進行名稱修飾。如果需要將修飾名放到 .def 檔案中,則可以通過使用 DUMPBIN 工具或 /MAP 連結器選項來獲取修飾名。請注意,編譯器產生的修飾名是編譯器特定的。如果將 Visual C++ 編譯器產生的修飾名放到 .def 檔案中,則連結到 DLL 的應用程式必須也是用相同版本的 Visual C++ 生成的,這樣呼叫應用程式中的修飾名才能與 DLL 的 .def 檔案中的匯出名相匹配。