def文件和exp文件

  1. 用法

    • .def 文件在编译时由开发者创建,用于指导链接器生成 DLL。
    • .exp 文件是 lib.exe 工具的输出,用于处理复杂的 DLL 依赖关系。
    • .lib 文件是链接器的输入,用于在编译时解析对 DLL 函数的调用。
  2. 区别

    • .def 文件是开发者手动编写的,用于明确指定 DLL 的导出符号和其他属性。
    • .exp 文件是自动生成的,它包含了 lib.exe 工具创建导入库时的导出符号信息。
    • .lib 文件是导入库,它包含了 DLL 导出符号的引用信息,用于链接阶段。

在实际开发中,如果使用了 .def 文件,那么在链接 DLL 时,链接器会使用 .def 文件中的信息来生成 DLL 的导出表。如果没有使用 .def 文件,那么链接器会查找源代码中的 __declspec(dllexport) 标记的符号作为导出符号。而 .exp 文件通常在处理复杂的 DLL 依赖关系时使用,它确保了正确的符号解析。.lib 文件则是在编译时链接到使用 DLL 的应用程序中,以便在运行时能够调用 DLL 中的函数。

def文件(module definition file模块定义文件)是用来创建dll和对应的导出库的。在一个.def文件中,你可以指定dll将会导出哪些符号给用户使用。linker会根据def文件的说明来生成dll和lib。一般的,dll的用户不会对def文件感兴趣(我是指使用dll的开发者和使用最终产品的用户)。注意他和静态链接库的不同点,默认的情况下,dll内部的符号是不可见的。我们有方法让他们可见--在def文件中使用exports语句。但是我们还有其他的方法,比如zaidll的源代码中使用__declspec(dllexport)或者在linker的选项中

使用 /EXPORT 选项来导出一个函数等等。事实上现在__declspec(dllexport)使用很多,而def文件很少使用了。使用def文件,你可以指示链接程序linker其他的一些信息而不是导出动作,比如堆栈的大小等等。但是这些选项经常在linker的命令行中标明了。事实上,def文件在早期win16的dll编程中使用现在在win32中我们基本上把它给抛弃了,以后也是如此。

在某些地方我们还看到一些.exp文件?exp文件就是导出文件(export file)。在前面的讨论中,我们讨论了使用linker去创建dll(中间还有它的导出库)现在,我们假设我们生成两个dll(or just executables)。但是他们都需要调用一些对方中函数,问题出现了。当我们生成a.dll的时候我们需要b.lib;但是b.lib在对应的b.dll生成之前没有生成,而b.dll的生成又需要a.lib。正因如此,微软的解决办法是使用exp文件,或者叫导出文件。在生成两个dll之前,你使用lib.exe(library mangager tool库管理工具)来创建一个.lib和.exp,即,DLL A 的a.lib 和a.exp,现在linker使用a.lib和DLL B 自己的东西去生成b.dll和b.lib。当你回来链接DLL A的时候你就有了b.lib。这里linker需要知道a.dll中需要导出处啥。这些信息都被缓存到了a.exp文件中。linker不需要def文件或者/EXPORT选项,它仅仅是加载a.exp中的信息。a.exp就像a.dll的两个生成过程(lib.exe and linker)的联系者一样。相似的,linker不会再次生成a.lib。总的来说,这种循环调用的情况不会和在我们的程序中出现,因此,希望你不会再你的程序中用到exp文件。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值