在链接器阶段可以使用 /DEFQ指定模块定义文Ӟ链接器选项调用 .def 文g?
如果生成? .exe 文g没有导出Q? .def 文g输出文g较大q低加载速度?
模块定义语句的规?
下列
语句、属性关键字和用h定的标识W区分大写?
包含I格或分? (;) 的长文g名必ȝ引号 (") 引v?
使用一个或多个I格、制表符或换行符Q将语句关键字同其参数分开和将各语句分开。指定参数的冒号 (:) 或等? (=) 两旁有零个或多个I格、制表符或换行符?
如果使用 NAME ? LIBRARY 语句Q则q些语句必须位于所有其他语句之前?
? .def 文g中,SECTIONS ? EXPORTS
语句可以出现多次。每个语句都可以采用多个规范Q各规范间必ȝ一个或多个I格、制表符或换行符分开。语句关键字必须在第一个规范的前面出现一ơ,q且?
以在每个附加规范的前面重复?
许多语句都具有等效的 LINK 命o行选项。有兛_他详l信息,请参阅相应的 LINK 选项说明?
.def 文g中的注释由每个注释行
以十q制或十六进制ؓ基础指定数值参数?
如果字符串参C保留字匹配,则必ȝ双引? (") 字W串参数引v?
DESCRIPTION "text"
该语句将字符串写? .rdata 节。将指定? text 用单引号或双引号Q? ? "Q引赗若要在字符串中使用引号Q单引号或双引号Q,L其他cd的标记括住字W串?
在模块定义文件中QDESCRIPTION 仅在生成虚拟讑֤驱动E序 (VxD) 时有效?
EXETYPE:dynamic | dev386
在模块定义文件中QEXETYPE 仅在生成虚拟讑֤驱动E序 (VxD) 时有效。如果生成虚拟设备驱动程序时在模块定义文件中没有指定
EXETYPEQƈ且如果没有指? /EXETYPE 链接器选项Q则静态加? (dev386) 生效?
EXPORTS
definitions
EXPORTS 语句引入了一个由一个或多个 definitionsQ导出的函数?nobr oncontextmenu="return false;" onmousemove="kwM(5);" id="key5" onmouseover="kwE(event,5, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">数据
导出 definitions 的语法ؓQ?
entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
entryname 是要导出的函数名或变量名。这是必选项。如果导出的名称? DLL 中的名称不同Q则通过
internalname 指定 DLL 中导出的名称。例如,如果 DLL 导出函数 func1()Q要它用作
func2()Q则应指定:
EXPORTS
func2=func1
@ordinal 允许指定是序可不是函数名进? DLL 的导。这有助于最化 DLL 的大?LIB 文g包含序号与函数之间的映,q您得以像通常在? DLL ?nobr oncontextmenu="return false;" onmousemove="kwM(6);" id="key6" onmouseover="kwE(event,6, this);" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick="return kwc();" onmouseout="kwL(event, this);" target="_blank">目中那样用函数名?
可选的 NONAME 关键字允许只按序号导出,q减结? DLL 中导的大。但是,如果要在 DLL 上? GetProcAddressQ则必须知道序号Q因为名U将无效?
可选的 PRIVATE 关键字禁止将 entryname 攑ֈ? LINK 生成的导入库中。它对同h? LINK 生成的图像中的导出无效?
可选的 DATA 关键字指定导出的是数据,而不是代码。例如,可以导出数据变量Q如下所C:
EXPORTS
i DATA
当对同一导出使用 PRIVATE ? DATA ӞPRIVATE 必须位于 DATA 的前面?
有三U导出定义的ҎQ按照徏议的使用序依次为:
源代码中? __declspec(dllexport) 关键?
.def 文g中的 EXPORTS 语句
LINK 命o中的 /EXPORT 规范
所有这三种Ҏ可以用在同一个程序中。LINK 在生成包含导出的E序时还创徏导入库,除非生成中用了 .exp 文g?
以下? EXPORTS 节的CZQ?
EXPORTS
DllCanUnloadNow @1 PRIVATE DATA
DllWindowName = Name DATA
DllGetClassObject @4 NONAME PRIVATE
DllRegisterServer @7
DllUnregisterServer
注意Q? .def 文g? DLL 中导出变量时Q不需要在变量上指?
__declspec(dllexport)。但是,在Q何? DLL 的文件中Q仍必须在数据声明上使用
__declspec(dllimport)?
LIBRARY [library][BASE=address]
该语句通知 LINK 创徏 DLL。LINK 同时q创建导入库Q除非生成中使用? .exp 文g?
library 参数指定 DLL 的名U。也可以使用 /out 链接器选项指定 DLL 输出名?
BASE=address 参数讄操作pȝ用来加蝲 DLL 的基址。该参数重写 0x10000000 的默? DLL 位置。有兛_址的详l信息,请参? /BASE 选项说明?
误住,在生? DLL 时? /DLL 链接器选项?
/HEAP:reserve[,commit]
HEAPSIZE 所展示的功能与 /HEAP 链接器选项相同?
NAME [application][BASE=address]
该语句指定主输出文g的名U。另一U指定输出文件名的方法是使用 /out 链接器选项Q而另一U设|基址的方法是使用 /BASE 链接器选项。如果两U方法都指定了,? /OUT 重写 NAME?
如果生成 DLLQNAME 只影响 DLL 名?
SECTIONS
definitions
SECTIONS 语句引入了一个由一个或多个
definitionsQ关于项目输出文件各节的讉K说明W)l成的节。每个定义必d单独一行上。SECTIONS
关键字可以在W一个定义所在的同一行或前一行上?def 文g可以包含一个或多个 SECTIONS 语句?
? SECTIONS 语句为图像文件中的一节或多节讄属性,q可用于重写每种节类型的默认属性?
definitions 的格式ؓQ?
.section_name specifier
此处Q?section_name 为程序图像中的节名,specifier Z列一个或多个讉K修饰W:
EXECUTE
READ
SHARED
WRITE
用空格分开修饰W名。例如:
SECTIONS
.rdata READ WRITE
SECTIONS 标记 definitions 节列表的开始位|。每个定义必d单独一行上。SECTIONS
关键字可以在W一个定义所在的同一行或前一行上?def 文g可以包含一个或多个 SECTIONS 语句。支? SEGMENTS
关键字作? SECTIONS 的同义词?
Visual C++ 的早期版本支持:
section [CLASS 'classname'] specifier
Z兼容性考虑Q支? CLASS 关键字,但忽略了它?
另一U指定节属性的Ҏ是? /SECTION 选项?
STACKSIZE reserve[,commit]
该语句设|堆栈的大小Q以字节为单位)。另一U设|堆栈的Ҏ是用堆栈分? (/STACK) 选项。有? reserve ? commit 参数的详l信息,请参阅关于该选项的文?
该选项? DLL 无效?
STUB:filename
当用于生成虚拟设备驱动程? (VxD) 的模块定义文件时QSTUB 允许指定包含在 VxD 中用的 IMAGE_DOS_HEADER
另一U指? filename 的方法是使用 /STUB 链接器选项?
在模块定义文件中QSTUB 仅在生成虚拟讑֤驱动E序 (VxD) 时有效?
VERSION major[.minor]
该语句通知 LINK 一个数字放? .exe 文g? DLL 的头中。major ? minor 参数是从 0 ? 65,535 的范围内的十q制数。默认gؓ 0.0 版?
另一U指定版本号的方法是使用版本信息 (/VERSION) 选项?
VXD filename
允许指定虚拟讑֤驱动E序 (VxD) 的名U。默认情况下QVxD 获取与第一个对象文件相同的名称?
另一U指定虚拟设备驱动程序版本的Ҏ是? /VXD 链接器选项Q另一U命名输出文件的Ҏ是? /out 选项?
在模块定义文件中QVXD 仅在生成虚拟讑֤驱动E序 (VxD) 时有效?/p>
?MSDN中的名词解释
模块定义 (.def) 文g为链接器提供有关被链接程序的导出、属性及其他斚w的信息。生?DLL Ӟ.def 文g最有用。由于存在可代替模块定义语句使用?a onclick="javascript:Track('ctl00_LibFrame_ctl01|ctl00_LibFrame_ctl02',this);" >链接器选项Q通常不需?.def 文g。也可以?__declspec(dllexport) 用作指定导出函数的手Dc在链接器阶D可以?/DEFQ指定模块定义文Ӟ链接器选项调用 .def 文g?br>如果生成?.exe 文g没有导出Q?.def 文g输出文g较大q低加载速度?br>通俗解释:
在VC
++中,生成DLL可以不?def文g。只需要在VC++的函数定义前要加__declspec(dllexport)修饰可以了。但是?
__declspec(dllexport)和?def文g是有区别的。如果DLL是提供给VC++用户使用的,你只需要把~译DLL时生的.
lib提供l用P它可以很L地调用你的DLL。但是如果你的DLL是供其他E序如VB、delphi,以及.NET
用户使用的,那么会生一个小ȝ。因为VC++对于__declspec(dllexport)声明的函Cq行名称转换Q如下面的函敎ͼ
__declspec(dllexport) int __stdcall IsWinNT()
会{换ؓIsWinNT@0Q这样你在VB中必这样声明:
Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
@的后面的数由于参数类型不同而可能不同。这昄不太方便。所以如果要想避免这U{换,p使用.def文g方式?
EXPORTS后面的数可以不给Q系l会自动分配一个数。对于VB、PB、Delphi用户Q通常使用按名U进行调用的方式Q这个数关系不大Q但是对于?lib链接的VCE序来说Q不是按名称q行调用Q而是按照q个数进行调用的Q所以最好给出?br>例子Q我们用VC6.0制作一个dll,不?def文gQ在头文件中q样?br>
#ifndef LIB_H
#define LIB_H
extern "C" int _declspec(dllexport)add(int x,int y);
#endif
如果?def文g,可以q样
LIBRARY "xxx_dll"
EXPORTS
add PRIVAT
原文地址 http://wanderwarriorhsiao.blog.hexun.com/13081159_d.html