原文链接地址:http://www.cnblogs.com/TianFang/archive/2013/05/04/3059073.html

在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

转载于:https://www.cnblogs.com/wuyuan2011woaini/p/4862825.html

使用def文件简化dll导出相关推荐

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

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

  2. DLL 导出方法(两种)

    使用 DEF 文件从 DLL 导出 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种特性的 Module 语句的文本文件. 如果不使用 __declspec(dllexport) 关键字 ...

  3. dll的概念、dll导出类(转)

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...

  4. 动态库def文件的使用

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

  5. 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法

    转自:https://blog.csdn.net/qing666888/article/details/41135245 一,__ declspec(dllexport): 将一个函数声名为导出函数, ...

  6. 使用Def文件导出dll

    前面我们介绍了dll的生成,大多数是使用extern "C"__declspec(dllexport)+函数名的方法导出dll.其实我们还有另一种方法来导出dll. 先介绍参考文献 ...

  7. 由dll导出lib文件

    老生长谈的问题了,网上的教程也很多,这里以实际例子作个备份,并说明下注意点. 只有dll文件(my.test.dll)和头文件,没有lib文件,需要导出lib,静态编译进代码中,用VS自带的dumpb ...

  8. Dll (.a)(.def)文件之间的转换

    1. dll生成.def文件 一般安装完VS后可以搜索dumpbin.exe,拷贝到你的dll文件夹下, 执行命令行:dumpbin.exe /exports ***.dll > ***.def ...

  9. vs下.def文件使用无效问题

    相信用vs2005编译写.dll的工程的人一定对.def文件不陌生吧,.def文件是描述哪些要被导出来的函数. 格式如下: LIBRARY CMPNT2 -->dll名称 EXPORTS --- ...

最新文章

  1. 浙江将建设超级高速公路,全面支持自动驾驶
  2. 【转】利用WCF的双工通信
  3. 轩辕传奇服务器合并信息,轩辕传奇9月1日部分服务器合服公告
  4. python图书管理系统增删改查_固定资产管理系统,高效管理企业资产
  5. 90% 程序员都吃亏在这门技术上了,你呢!
  6. jquery触发点击事件
  7. 让电影票房飞一会儿,五一换个姿势重温经典
  8. android 65536 简书,app编译打包时的65536问题
  9. 5.22青海云南同震
  10. 【0x50 动态规划】传纸条【线性DP】
  11. mandriva2010 xp ubuntu10.04 三系统的安装
  12. 输入经纬度在地图中标注位置(百度地图)
  13. 天下谁人不识君,体面的礼品
  14. 河南高中学业水平计算机,河南高中学业水平考试
  15. 7-2 一元多项式的乘法与加法运算 (20 分)
  16. Xutils上传图片(2)
  17. Fluent UDF代码编写
  18. 祝福大家劳动节节日快乐
  19. 干货:一文读懂数据仓库设计方案
  20. QQ界面技术(DirectUI)

热门文章

  1. Windows域策略设置 IE信任站点【全域策略生效】
  2. notepad++设置自动刷新文本(中文版/英文版)
  3. powershell自动化操作AD域、Exchange邮箱系列(10)—获取Exchange邮箱用户配额并导出excel
  4. vi/vim的使用方法及常用的快捷键--vimer们的福音
  5. python进阶19垃圾回收GC
  6. 现代人必须掌握的成功学方法
  7. 单链表删除指定节点c语言,在单链表删除指定节点之后的节点
  8. 初中数学抽象教学的案例_初中数学教学反思案例
  9. linux与linux传文件乱码,关于Linux与windows传递文件乱码问题
  10. 计算机算法设计与分析 最大子段和问题