使用def文件简化dll导出
原文链接地址: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导出相关推荐
- 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
在C++中,我们可以通过 __declspec(dllexport) 将函数导出为Dll中供其它程序使用,例如: _declspec(dllexport) int add(int a, int b); ...
- DLL 导出方法(两种)
使用 DEF 文件从 DLL 导出 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种特性的 Module 语句的文本文件. 如果不使用 __declspec(dllexport) 关键字 ...
- dll的概念、dll导出类(转)
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...
- 动态库def文件的使用
DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明:另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被 ...
- 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法
转自:https://blog.csdn.net/qing666888/article/details/41135245 一,__ declspec(dllexport): 将一个函数声名为导出函数, ...
- 使用Def文件导出dll
前面我们介绍了dll的生成,大多数是使用extern "C"__declspec(dllexport)+函数名的方法导出dll.其实我们还有另一种方法来导出dll. 先介绍参考文献 ...
- 由dll导出lib文件
老生长谈的问题了,网上的教程也很多,这里以实际例子作个备份,并说明下注意点. 只有dll文件(my.test.dll)和头文件,没有lib文件,需要导出lib,静态编译进代码中,用VS自带的dumpb ...
- Dll (.a)(.def)文件之间的转换
1. dll生成.def文件 一般安装完VS后可以搜索dumpbin.exe,拷贝到你的dll文件夹下, 执行命令行:dumpbin.exe /exports ***.dll > ***.def ...
- vs下.def文件使用无效问题
相信用vs2005编译写.dll的工程的人一定对.def文件不陌生吧,.def文件是描述哪些要被导出来的函数. 格式如下: LIBRARY CMPNT2 -->dll名称 EXPORTS --- ...
最新文章
- 浙江将建设超级高速公路,全面支持自动驾驶
- 【转】利用WCF的双工通信
- 轩辕传奇服务器合并信息,轩辕传奇9月1日部分服务器合服公告
- python图书管理系统增删改查_固定资产管理系统,高效管理企业资产
- 90% 程序员都吃亏在这门技术上了,你呢!
- jquery触发点击事件
- 让电影票房飞一会儿,五一换个姿势重温经典
- android 65536 简书,app编译打包时的65536问题
- 5.22青海云南同震
- 【0x50 动态规划】传纸条【线性DP】
- mandriva2010 xp ubuntu10.04 三系统的安装
- 输入经纬度在地图中标注位置(百度地图)
- 天下谁人不识君,体面的礼品
- 河南高中学业水平计算机,河南高中学业水平考试
- 7-2 一元多项式的乘法与加法运算 (20 分)
- Xutils上传图片(2)
- Fluent UDF代码编写
- 祝福大家劳动节节日快乐
- 干货:一文读懂数据仓库设计方案
- QQ界面技术(DirectUI)
热门文章
- Windows域策略设置 IE信任站点【全域策略生效】
- notepad++设置自动刷新文本(中文版/英文版)
- powershell自动化操作AD域、Exchange邮箱系列(10)—获取Exchange邮箱用户配额并导出excel
- vi/vim的使用方法及常用的快捷键--vimer们的福音
- python进阶19垃圾回收GC
- 现代人必须掌握的成功学方法
- 单链表删除指定节点c语言,在单链表删除指定节点之后的节点
- 初中数学抽象教学的案例_初中数学教学反思案例
- linux与linux传文件乱码,关于Linux与windows传递文件乱码问题
- 计算机算法设计与分析 最大子段和问题