使用def文件简化dll导出

转载 2015年11月20日 14:57:45

在C++中,我们可以通过 __declspec(dllexport) 将函数导出为Dll中供其它程序使用,例如:

    _declspec(dllexport) int add(int a, int b);

在这种方式下,如果调用该dll的是一个c++程序(同一个编译器的版本)是没有问题的。但是,如果调用该dll是一个其它语言的程序(如C#、VB),则会出错。究其原因,是因为在C++中存在函数的重载,允许函数重名,因此在编译器生成dll的时候,为了区别重名的程序,会将其进行一定算法进行名称转换。例如,对于前面的add函数,实际的函数名称是如下形式。

    

因此,我们直接通过函数名add是无法找到该函数的,从而导致调用失败。为了解决这一问题,我们往往在函数前面再加一个extern "C"使用C方式的函数命名规则。

    extern "C" _declspec(dllexport) int add(int a, int b);

这样函数的名称就成add了。

    

这样,我们就需要在每一个函数签名加上"extern "C" _declspec(dllexport)"这一长串声明。如果需要导出的函数较多则显得非常繁琐,也非常难看。为了简化这一过程,MS引入了def文件方便我们操作。

使用Def文件比较简单,只需要在项目中添加一个def文件,然后把我们要导出的函数放在def文件中即可。

    

Def文件的简单示例如下:

    LIBRARY
    EXPORTS
        add

最后记得在链接器选项中选中使用的def文件(默认情况下,添加def文件时会自动加上该选项,无需手动更改)。

    

这样,我们的函数无需加那一堆前缀,仍然可以使用默认的int add(int a, int b);形式,但导出后的方式然是C形式的函数定义。

    

最后指得一提的是,一般C/C++默认的调用方式是__cdecl,这种方式下需要调用方对函数清栈。如果对外提供api共其它非C++程序使用时,调用方会无法清栈而出错(C#会直接报函数声明不匹配的错误)。因此,对外提供api时还应该将接口声明为__stdcall,让api函数自己清栈。这也是Windows API前面都加上了一个WINAPI的宏的原因。

def文件还有许多其它的高级用法,要进一步了解的话,可以参看一下MS的官方文档:

http://msdn.microsoft.com/zh-cn/library/28d6s79h(v=vs.80).aspx

使用Def文件导出dll

前面我们介绍了dll的生成,大多数是使用extern "C"__declspec(dllexport)+函数名的方法导出dll。其实我们还有另一种方法来导出dll。 先介绍参考文献: 1.dll导...
  • xiamentingtao
  • xiamentingtao
  • 2016年04月04日 14:47
  • 1674

使用 DEF (模块定义) 文件从 DLL 导出函数和类

块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。 它可以在不同的编译器上面用相同的名字, 如果不使用 __declspec(dll...
  • gxp
  • gxp
  • 2011年11月30日 11:59
  • 1321

使用def文件简化dll导出

在C++中,我们可以通过 __declspec(dllexport) 将函数导出为Dll中供其它程序使用,例如:     _declspec(dllexport) int add(int a, ...
  • rongwenbin
  • rongwenbin
  • 2014年02月17日 12:17
  • 389

Windows 下根据dll和def文件导出lib文件

使用小型数据库SQLite3就要http://www.sqlite.org/download.html下载他的源码。直接下载官方编译好的dll文件。 sq...
  • larntin2002
  • larntin2002
  • 2007年10月22日 10:48
  • 4825

def文件 导出dll重载函数

转载地址:http://blog.163.com/very_apple/blog/static/27759236201092024110861/ 动态链接库DLL_Sample.dll DLL...
  • u013617648
  • u013617648
  • 2015年09月09日 20:38
  • 722

DLL中.def文件的使用

 DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明;另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关...
  • sky04
  • sky04
  • 2010年03月23日 23:17
  • 14885

使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例

转载地址:http://www.2cto.com/kf/201303/197199.html 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不...
  • blacet
  • blacet
  • 2015年11月02日 10:07
  • 1907

vs添加现有def文件无法导出函数

今天给别人帮忙生成一个dll文件,所有文件(包括def文件)被添加至工程后,无论如何导出不了函数,最后发现将原有def文件删除,然后再添加,dll里有了导出函数,怪哉,异哉,不懂。今天暂且记下一笔,防...
  • xbgprogrammer
  • xbgprogrammer
  • 2014年12月04日 13:28
  • 1553

DLL中.DEF文件的使用

DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明;另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被...
  • piaopiaopiaopiaopiao
  • piaopiaopiaopiaopiao
  • 2014年07月27日 22:26
  • 1262

用于生成DLL文件的def文件的规范写法

*.def文件介绍 模块定义   (.def)   文件为链接器提供有关被链接程序的导出、属性及其他方面的 信息。 使用DEF文件来输出函数的一个最主要目的就是:将编译器生成的函数修饰...
  • ddx279678775
  • ddx279678775
  • 2015年10月30日 10:33
  • 238
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用def文件简化dll导出
举报原因:
原因补充:

(最多只允许输入30个字)