2010-08-14 72 views
1
LIBRARY  Vcam.ax 
EXPORTS 
      DllMain     PRIVATE 
      DllGetClassObject  PRIVATE 
      DllCanUnloadNow   PRIVATE 
      DllRegisterServer  PRIVATE 
      DllUnregisterServer  PRIVATE 

以上是從Filters.def,它實際上做了什麼?如何理解.def文件?

+0

你永遠需要導出的DllMain。 – 2015-11-18 11:49:06

回答

4

請參閱MSDN:

Module-Definition (.def) Files

Exporting from a DLL Using DEF Files

關於PRIVATE,他們說this

可選關鍵字PRIVATE防止 entryname被放置在生成的 導入庫由LINK。它對 圖像中的導出也沒有影響,該圖像也是由LINK生成的。

換句話說,這些函數對DLL的入口點表是隱藏的,併爲操作系統保留。

+0

爲什麼需要'.def',是不是'.h'? – user198729 2010-08-14 08:27:03

+1

@u:你不想在程序中導出每一個小函數。 – Potatoswatter 2010-08-14 08:42:18

+1

.h文件是在編譯時的源代碼。 .def文件適用於運行時的其他程序。 – Puppy 2010-08-14 13:54:15

2

Win32上的.def文件描述了從DLL中導出的函數。與gcc/Linux上的.so文件不同,默認情況下,每個符號都會被導出,您必須告訴編譯器哪些函數要導出。標準的方法是將其列在.def文件中。另一種方法是在Visual C++中使用__declspec(dllexport)(其中使用修飾的函數名稱不會很有趣)。

函數名後面有一些關鍵字;你可以編寫一個序號,它不應該按名稱導出(可以隱藏你的函數名),也可以是私有的。

在MSDN文檔描述了完整的格式爲:
Module-Definition (.def) Files

+0

'.def'不會影響'.dll'的大小,是不是? – user198729 2010-08-14 09:37:27

+0

.def文件打包在.dll中。但是,實際情況是.def文件的大小與.dll的編譯大小相比並不重要。 – Puppy 2010-08-14 13:53:56

+0

.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