LIBRARY Vcam.ax
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
以上是從Filters.def
,它實際上做了什麼?如何理解.def文件?
LIBRARY Vcam.ax
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
以上是從Filters.def
,它實際上做了什麼?如何理解.def文件?
請參閱MSDN:
Module-Definition (.def) Files
Exporting from a DLL Using DEF Files
關於PRIVATE
,他們說this:
可選關鍵字PRIVATE防止 entryname被放置在生成的 導入庫由LINK。它對 圖像中的導出也沒有影響,該圖像也是由LINK生成的。
換句話說,這些函數對DLL的入口點表是隱藏的,併爲操作系統保留。
爲什麼需要'.def',是不是'.h'? – user198729 2010-08-14 08:27:03
@u:你不想在程序中導出每一個小函數。 – Potatoswatter 2010-08-14 08:42:18
.h文件是在編譯時的源代碼。 .def文件適用於運行時的其他程序。 – Puppy 2010-08-14 13:54:15
Win32上的.def文件描述了從DLL中導出的函數。與gcc/Linux上的.so文件不同,默認情況下,每個符號都會被導出,您必須告訴編譯器哪些函數要導出。標準的方法是將其列在.def文件中。另一種方法是在Visual C++中使用__declspec(dllexport)(其中使用修飾的函數名稱不會很有趣)。
函數名後面有一些關鍵字;你可以編寫一個序號,它不應該按名稱導出(可以隱藏你的函數名),也可以是私有的。
在MSDN文檔描述了完整的格式爲:
Module-Definition (.def) Files
'.def'不會影響'.dll'的大小,是不是? – user198729 2010-08-14 09:37:27
.def文件打包在.dll中。但是,實際情況是.def文件的大小與.dll的編譯大小相比並不重要。 – Puppy 2010-08-14 13:53:56
.def文件不是「鏈接到」的,它更像是鏈接器的一個指令,它的功能包括在DLL的導出表中。 .def文件可以影響DLL的大小:當函數不被.def文件導出時,並且/ OPT:REF選項用於刪除未使用的函數和數據,並且該函數不是在DLL內部使用,那麼鏈接器可能決定完全不包含該函數。請參閱此鏈接的/ OPT開關: http://msdn.microsoft.com/en-us/library/bxwfs976%28VS.80%29.aspx – vividos 2010-08-15 13:57:05
你永遠需要導出的DllMain。 – 2015-11-18 11:49:06