模块定义   (.def)   文件   
  模块定义   (.def)   文件为链接器提供有关被链接程序的导出、属性及其他方面的 
  信息。生成   DLL   时,.def   文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要   .def   文件。也可以将__declspec(dllexport)   用作指定导出函数的手段。   
  在链接器阶段可以使用   /DEF(指定模块定义文件)链接器选项调用   .def   文件。   
  如果生成的   .exe   文件没有导出,使用   .def   文件将使输出文件较大并降低加载速度。   
  模块定义语句的规则   
  下列语法规则适用于   .def   文件中的所有语句。其他适用于特定语句的规则与各语句一起加以说明。     
  语句、属性关键字和用户指定的标识符区分大小写。     
  包含空格或分号   (;)   的长文件名必须用引号   (")   引起。     
  使用一个或多个空格、制表符或换行符,将语句关键字同其参数分开和将各语句分开。指定参数的冒号   (:)   或等号   (=)   两旁有零个或多个空格、制表符或换行符。     
  如果使用   NAME   或   LIBRARY   语句,则这些语句必须位于所有其他语句之前。     
  在   .def   文件中,SECTIONS   和   EXPORTS   语句可以出现多次。每个语句都可以采用多个规范,各规范间必须用一个或多个空格、制表符或换行符分开。语句关键字必须在第一个规范的前面出现一次,并且可以在每个附加规范的前面重复。     
  许多语句都具有等效的   LINK   命令行选项。有关其他详细信息,请参阅相应的   LINK   选项说明。     
  .def   文件中的注释由每个注释行开始处的分号   (;)   指定。注释不能与语句共享一行,但可以在多行语句的规范间出现。(SECTIONS   和   EXPORTS   为多行语句。)     
  以十进制或十六进制为基础指定数值参数。     
  如果字符串参数与保留字匹配,则必须用双引号   (")   将字符串参数引起。   
  DESCRIPTION   "text"   
  该语句将字符串写入   .rdata   节。将指定的   text   用单引号或双引号('   或   ")引起。若要在字符串中使用引号(单引号或双引号),请用其他类型的标记括住字符串。   
  在模块定义文件中,DESCRIPTION   仅在生成虚拟设备驱动程序   (VxD)   时有效。   
  EXETYPE:dynamic   |   dev386   
  在模块定义文件中,EXETYPE   仅在生成虚拟设备驱动程序   (VxD)   时有效。如果生成虚拟设备驱动程序时在模块定义文件中没有指定   EXETYPE,并且如果没有指定   /EXETYPE   链接器选项,则静态加载   (dev386)   生效。   
  EXPORTS   
  definitions   
  EXPORTS   语句引入了一个由一个或多个   definitions(导出的函数或数据)组成的节。每个定义必须在单独一行上。EXPORTS   关键字可以在第一个定义所在的同一行上或在前一行上。.def   文件可以包含一个或多个   EXPORTS   语句。   
  导出   definitions   的语法为:   
  entryname[=internalname]   [@ordinal   [NONAME]]   [PRIVATE]   [DATA]   
  entryname   是要导出的函数名或变量名。这是必选项。如果导出的名称与   DLL   中的名称不同,则通过   internalname   指定   DLL   中导出的名称。例如,如果   DLL   导出函数   func1(),要将它用作   func2(),则应指定:   
  EXPORTS   
  func2=func1   
  @ordinal   允许指定是序号而不是函数名将进入   DLL   的导出表。这有助于最小化   DLL   的大小。.LIB   文件将包含序号与函数之间的映射,这使您得以像通常在使用   DLL   的项目中那样使用函数名。   
  可选的   NONAME   关键字允许只按序号导出,并减小结果   DLL   中导出表的大小。但是,如果要在   DLL   上使用   GetProcAddress,则必须知道序号,因为名称将无效。   
  可选的   PRIVATE   关键字禁止将   entryname   放到由   LINK   生成的导入库中。它对同样是由   LINK   生成的图像中的导出无效。   
  可选的   DATA   关键字指定导出的是数据,而不是代码。例如,可以导出数据变量,如下所示:   
  EXPORTS   
  i   DATA   
  当对同一导出使用   PRIVATE   和   DATA   时,PRIVATE   必须位于   DATA   的前面。   
  有三种导出定义的方法,按照建议的使用顺序依次为:     
  源代码中的   __declspec(dllexport)   关键字     
  .def   文件中的   EXPORTS   语句     
  LINK   命令中的   /EXPORT   规范     
  所有这三种方法可以用在同一个程序中。LINK   在生成包含导出的程序时还创建导入库,除非生成中使用了   .exp   文件。   
  以下是   EXPORTS   节的示例:   
  EXPORTS   
  DllCanUnloadNow             @1           PRIVATE       DATA   
  DllWindowName   =   Name                 DATA   
  DllGetClassObject         @4   NONAME       PRIVATE   
  DllRegisterServer         @7   
  DllUnregisterServer   
  注意,使用   .def   文件从   DLL   中导出变量时,不需要在变量上指定   __declspec(dllexport)。但是,在任何使用   DLL   的文件中,仍必须在数据声明上使用   __declspec(dllimport)。   
  LIBRARY   [library][BASE=address]   
  该语句通知   LINK   创建   DLL。LINK   同时还创建导入库,除非生成中使用了   .exp   文件。   
  library   参数指定   DLL   的名称。也可以使用   /out   链接器选项指定   DLL   输出名。   
  BASE=address   参数设置操作系统用来加载   DLL   的基址。该参数重写   0x10000000   的默认   DLL   位置。有关基址的详细信息,请参阅   /BASE   选项说明。     
  请记住,在生成   DLL   时使用   /DLL   链接器选项。   
  /HEAP:reserve[,commit]   
  HEAPSIZE   所展示的功能与   /HEAP   链接器选项相同。   
  NAME   [application][BASE=address]   
  该语句指定主输出文件的名称。另一种指定输出文件名的方法是使用   /out   链接器选项,而另一种设置基址的方法是使用   /BASE   链接器选项。如果两种方法都指定了,则   /OUT   重写   NAME。     
  如果生成   DLL,NAME   将只影响   DLL   名。   
  SECTIONS   
  definitions   
  SECTIONS   语句引入了一个由一个或多个   definitions(关于项目输出文件各节的访问说明符)组成的节。每个定义必须在单独一行上。SECTIONS   关键字可以在第一个定义所在的同一行或前一行上。.def   文件可以包含一个或多个   SECTIONS   语句。   
  该   SECTIONS   语句为图像文件中的一节或多节设置属性,并可用于重写每种节类型的默认属性。   
  definitions   的格式为:   
  .section_name   specifier   
  此处,.section_name   为程序图像中的节名,specifier   为下列一个或多个访问修饰符:     
  EXECUTE     
  READ     
  SHARED     
  WRITE     
  用空格分开修饰符名。例如:   
  SECTIONS   
  .rdata   READ   WRITE   
  SECTIONS   标记   definitions   节列表的开始位置。每个定义必须在单独一行上。SECTIONS   关键字可以在第一个定义所在的同一行或前一行上。.def   文件可以包含一个或多个   SECTIONS   语句。支持   SEGMENTS   关键字作为   SECTIONS   的同义词。   
  Visual   C++   的早期版本支持:   
  section   [CLASS   'classname']   specifier   
  出于兼容性考虑,支持   CLASS   关键字,但忽略了它。   
  另一种指定节属性的方法是使用   /SECTION   选项。   
  STACKSIZE   reserve[,commit]   
  该语句设置堆栈的大小(以字节为单位)。另一种设置堆栈的方法是使用堆栈分配   (/STACK)   选项。有关   reserve   和   commit   参数的详细信息,请参阅关于该选项的文档。     
  该选项对   DLL   无效。   
  STUB:filename   
  当用于生成虚拟设备驱动程序   (VxD)   的模块定义文件时,STUB   允许指定包含将在   VxD   中使用的   IMAGE_DOS_HEADER   结构(在   WINNT.H   中定义)而不是默认头的文件名。   
  另一种指定   filename   的方法是使用   /STUB   链接器选项。   
  在模块定义文件中,STUB   仅在生成虚拟设备驱动程序   (VxD)   时有效。   
  VERSION   major[.minor]   
  该语句通知   LINK   将一个数字放到   .exe   文件或   DLL   的头中。major   和   minor   参数是从   0   到   65,535   的范围内的十进制数。默认值为   0.0   版。   
  另一种指定版本号的方法是使用版本信息   (/VERSION)   选项。     
  VXD   filename   
  允许指定虚拟设备驱动程序   (VxD)   的名称。默认情况下,VxD   获取与第一个对象文件相同的名称。   
  另一种指定虚拟设备驱动程序版本的方法是使用   /VXD   链接器选项,另一种命名输出文件的方法是使用   /out   选项。   
  在模块定义文件中,VXD   仅在生成虚拟设备驱动程序   (VxD)   时有效。
  二.MSDN中的名词解释
  模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将 __declspec(dllexport) 用作指定导出函数的手段。在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件。
  如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。
  通俗解释:
  在VC ++中,生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用 __declspec(dllexport)和使用.def文件是有区别的。如果DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的. lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如VB、delphi,以及.NET
  用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数: 
  __declspec(dllexport) int __stdcall IsWinNT() 
  会转换为IsWinNT@0,这样你在VB中必须这样声明: 
  Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long 
  @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。 
  EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。
  例子:我们用VC6.0制作一个dll,不使用.def文件,在头文件中这样写
  #ifndef LIB_H
  #define LIB_H
  extern "C" int _declspec(dllexport)add(int x,int y);
  #endif 
  如果是.def文件,可以这样
  LIBRARY      "xxx_dll"
  EXPORTS
  add  PRIVAT

def文件格式的更多相关文章

  1. lib和dll文件的区别和联系

    什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37)    (1)lib是编译时需要的,dll是运行时需要的. 如果要完成源代码的编译,有lib就够了. 如果也使动态 ...

  2. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  3. 文件转换dll mingw

    MinGW:c -> o           gcc -c a.cc -> exe         gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a. ...

  4. dll和lib的关系(转)

    转自http://blog.163.com/zhengjiu_520/blog/static/3559830620093583438464/ 前面有一章说编译与链接的,说得很简略,其实应该放到这一章一 ...

  5. [转载]lib和dll文件的区别和联系

    出处:https://blog.csdn.net/weiaipan1314/article/details/52252478 什么是lib文件,lib和dll的关系如何 (2008-04-18 19: ...

  6. 如何从dll文件导出对应的lib文件?

    [时间:2016-05] [状态:Open] 引言 近期由于不再使用vs生成lib,考虑使用windows下gcc生成一个动态库,供第三方调用,发现编译之后只有dll,lib如何处理? 好吧,这就是本 ...

  7. MSVC vs. MinGW 之dll玩转攻略手记【转

    一份粗糙的研究记录,有待补完和整理. MinGW:c -> o           gcc -c a.cc -> exe         gcc a.c libs.o -o a.exe ( ...

  8. DLL编写中extern “C”和__stdcall的作用

    动态链接库的使用有两种方式,一种是显式调用.一种是隐式调用. (1)       显式调用:使用LoadLibrary载入动态链接库.使用GetProcAddress获取某函数地址. (2)      ...

  9. dll总结

    [转]http://www.cnblogs.com/cswuyg/archive/2011/09/30/dll.html 动态链接库dll的使用有两种方式,一种是显式调用.一种是隐式调用. (1)   ...

随机推荐

  1. hdu Line belt

    这道题是一道3分搜索的题.其实这种题很多时候都出现在高中的解析几何上,思路很简单,从图中可以看到,肯定在AB线段和CD线段上各存在一点x和y使得所花时间最少 因为AB和CD上的时间与x和y点的坐标都存 ...

  2. PowerShell - Read an Excel file using COM Interface

    http://www.lazywinadmin.com/2014/03/powershell-read-excel-file-using-com.html

  3. 《GK101任意波发生器》升级固件发布(版本:1.0.2build306)

    一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build306 编译日期:2014-09-24 ====================================== 二. ...

  4. NBUT 1028 该减肥了(简单递推)

    [1028] 该减肥了 时间限制: 1000 ms 内存限制: 65535 K 问题描述 由于长期缺乏运动,Teacher Xuan发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥.Teach ...

  5. phpstorm8注册码

    phpstorm8注册码 phpstorm 8 注册码   用户名:Learn Programming License key:(包括LICENSE BEGIN和LICENSE END部分) ==== ...

  6. Android TextView 显示不全的自动补齐方式

    TextView在Android开发中用到的地方应该是很多的.很多时候,TextView会有一行显示不全被截取或者会换行.之前我的解决办法比较笨拙,定死TextView的一行字数长度,最后一个以省略号 ...

  7. Summary of java stream classes

    Java’s stream classes are good for streaming sequences of bytes, but they’re not good for streaming ...

  8. 取消svn关联

    把下面这段文字保存成一个reg文件 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\sh ...

  9. 超简单的处理JSON格式和JSON数组格式的String

    现在网站上有不少处理JSON格式的工具类,但是我找了一天,发现大都是需要编写相应对象类来进行处理,比较麻烦,比如:Gson,json-lib.Gson,json-lib这些处理那些接口之类的参数名字和 ...

  10. 业界有很多MQ产品

    目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量 ...