打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VC++中(.def) 文件

VC++中(.def) 文件


一直没什么问题的工程突然出了问题,这个原因出现过几次都是糊里糊涂就过去了,今天贴出来作为技术总结吧。以下就是在C++中自建的dll定义的API,是不是应该在.def中做一个声明。

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DLL中.def文件的使用
VC 动态链接库(DLL)编程深入浅出
VS中def文件对于生成dll和lib文件的作用
c++生成dll
使用 __declspec(dllexport) 从 DLL 导出
vc dll 浮点传递 与调用约定 问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服