VC++中的.DEF文件详解

为了下一篇文章做点准备。

 

首先,关于.DEF文件,MSDN有这么几行字说明:

 

Module-definition (.DEF) files provide the linker with information about exports, attributes, and other information about the program to be linked. Use the /DEF option to specify the .DEF file name. Because LINK provides options and other features that can be used instead of module-definition statements, .DEF files are generally not necessary.

注:模块定义文件(.DEF)文件将要链接的程序的输出函数,属性和其他信息提供给链接器(大侠注:链接是编译过程的最终步骤)。使用/def 参数以置顶.DEF文件名。因为链接提供的参数(大侠注:这些参数可能来自IDE或者命令行手动指定)可能替换模块定义语句,.DEF文件通常不是必要的。

 

下面是关于.DEF文件的MSDN帮助:

A module-definition (.DEF) file is a text file that contains statements for defining an .EXE file or DLL.
Because LINK provides equivalent command-line options for most module-definition statements, a typical program for Win32 does not usually require a .DEF file. The descriptions of the module-definition statements give the command-line equivalent for each statement.
See the following sections for more information: 

Rules for Module-Definition Statements

NAME

LIBRARY

DESCRIPTION

STACKSIZE

SECTIONS

EXPORTS

VERSION 


意思大体与上面的一致,我就不具体翻译了。主要是.DEF可包括那几个关键字,下面做注意说明:

1.模块定义语句的规则

    关键字不是大小写敏感的,而用户标识符则是大小写敏感的。如ExPoRtS与EXPORTS都是可以的,但是你定义一个函数fnTest,则不能写为fntest。

    常文件名包括空格或分号,必须用引号包括起来。

    语句之间,关键字和参数之间用一个或多个空格、制表符或换行隔开。冒号或者等号指明参数被零个或多个空格、制表符或换行包围。

    如果使用NAME或LIBRARY,则必须在其他语句之前。

    大多数语句只出现一次并接受特定的参数。参数跟在关键字后面相同的行或后续的行中。此后如果有使用不同参数的语句,则后面的语句会覆盖前面的语句。

    SECTIONS, EXPORTS, IMPORTS可以出现多次并能拥有多个参数,参数之间以一个或多个空格、制表符或换行隔开。关键字必须在第一个参数之前出现一次,可以在没割参数前面都出现。

    许多语句于对应的LINK选项相同(大侠注:原词equivalent),请参阅对应的LINK选项以获取更多的详细说明。

    以分号开始的行为注释行。注释行不能和其他语句同在一行上,但可以在多行语句只中。(SECTIONS和EXPORTS是多行语句。)

    数字用十进制或C语言表示法。(大侠注:0x10=16)

    如果一个字符参数于保留字相同,则用引号包括起来。

 

2.NAME语法

    NAME [application][BASE=address]

    该语句指定输出文件名。指定输出文件名与/OUT参数是等效的,而指定代码基址则于/BASE参数是等效的。如果都已指定,那么/OUT参数覆盖NAME语句。

 

3.LIBRARY语法

    LIBRARY [library][BASE=address]

    此语句告诉链接器创建一个DLL,与此同时,链接器创建一个导入库,除非对应的.exp文件在生成中已经使用。

    library语句指定DLL的内部名称(使用/out参数指定输出文件名)。

    BASE参数设置操作系统装载DLL的基址,它会覆盖默认基址=0x10000000,参阅/BASE参数了解关于基址的详情。

    同样,等效的参数是/DLL和/BASE。

 

4.DESCRIPTION语法

    DESCRIPTION "text"

    此语句将一个字符串写入.rdata块,文本用一个或两个引号('或")包括。字符串中使用引号,则用另外的引号包括字符串。

    此语句于/COMMENT参数是不同的。

 

5.STACKSIZE语法

    STACKSIZE reserve[,commit]

    此语句以字节为单位设置堆栈的大小。与/STACK参数是等效的,查阅此参数的文档以了解reserve和commit参数的详情。

    (大侠:微软这么说,意思就是不建议我们去设置它。)

 

6.SECTION语法

    section [CLASS 'classname'] attributes

    此语句设置镜像文件中一个或多个块的属性。可以用来重写各个块的默认属性。(大侠:汇编语言中,准确的术语是“段”,如.data默认是数据段,.code默认是代码段。)

    SECTION标志块定义列表的开始,每一个定义必须分在不同的行上。SECTION关键字可以在第一个定义相同的行或之前的行上。一个.DEF文件可以有多个SECTION语句,SEGMENTS关键字可作为SECTION的替代关键字。

    块名称是大小写敏感的。CLASS关键字用于提供兼容性,它会被忽略。属性参数是以下几个之一:EXECUTE, READ, SHARED 和 WRITE.

    等效的参数是/SECTION。

 

7.EXPORTS语法

    entryname[=internalname] [@ordinal[NONAME]] [DATA] [PRIVATE]

    此语句使一个或多个定义能输出给其他程序。

    大侠:EXPORTS关键字与SECTION关键字规则相同,不再翻译赘述。

    可选的PRIVATE关键字可以防止LINK产生的导入库替换entryname。它对LINK产生的镜像中的导出没有影响。

    对于定义的输出,有三种按推荐程度排列的方法:

    1).在源代码使用__declspec(dllexport)。

    2).在.DEF文件使用EXPORTS语句。

    3).在LINK命令中使用/EXPORT指定。

    这三种方法可以在一个程序中同时使用。当LINK创建一个程序包括输出,那么同时也会创建一个导入库,除非对应的.exp文件已在使用。

 

8.VERSION语法

    VERSION major[.minor]

    此语句告诉链接器把一个数字写入EXE或DLL的头部。major 和 minor参数是0到65535之间的数值。默认是0.0。

    等效的方法是编译时的/VERSION选项。

 

大侠注:个人水平限制,请勿用作论文材料或依据。详情请查阅MSDN。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值