免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9104 | 回复: 6

动态库导出函数和变量,用头文件不就行了,什么时候需要用Def文件export变量? [复制链接]

论坛徽章:
0
发表于 2010-08-30 18:21 |显示全部楼层
10可用积分
什么时候必须要用到Def文件来导出变量和其他的内容呢?

似乎找不到这样的必要性。一般用头文件包含一下声明,不就行了吗?

最佳答案

查看完整内容

导出函数和变量, 必须使用def的情况不多:1. 编译器不支持 __declspec(dllexport)/__declspec(dllimport)VC6(包括)以后都支持的, 所以不支持这个的cl编译器我没用过……2. 按序号导出dllexport/dllimport是按符号导出的。可能ms认为序号导出是不推荐的, 所以新的dllexport/dllimport就没有支持序号导出。如果真打算使用序号, 就只能使用def文件。PS: 其实, def文件好像依然不是必须的, def文件的内容好像都有对应的linker ...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2010-08-30 18:21 |显示全部楼层
导出函数和变量, 必须使用def的情况不多:

1. 编译器不支持 __declspec(dllexport)/__declspec(dllimport)

VC6(包括)以后都支持的, 所以不支持这个的cl编译器我没用过……

2. 按序号导出

dllexport/dllimport是按符号导出的。
可能ms认为序号导出是不推荐的, 所以新的dllexport/dllimport就没有支持序号导出。

如果真打算使用序号, 就只能使用def文件。



PS: 其实, def文件好像依然不是必须的, def文件的内容好像都有对应的linker option。
比如/export:sum=sum@8
btw, sum@8是__stdcall产生的, ls的代码要使用/Gz才能产生sum@8这样的符号


导出变量还是使用dllexport/dllimport吧。 只用def文件是不够的。

论坛徽章:
0
发表于 2010-08-30 20:54 |显示全部楼层
DEF是Windows的咚咚

linux下,只需要so文件就能链接

Windows下,除了dll文件外,还需要一个辅助的lib文件,这个文件可以通过DEF文件来生成

论坛徽章:
0
发表于 2010-08-30 21:10 |显示全部楼层
DLL有两种加载方式:程序启动时的隐式加载和运行时的显示加载,而后者需要使用GetProcAddress来获取函数指针。

如果需要制作用于显示加载的第三方DLL,此时一般需要用DEF文件来指定导出符号(函数、变量等)的名字。如果不使用DEF文件,那么这些名字看上去会比较乱(Decorated Name)。

另外,为了保证其它编译器也能够使用你的DLL,那么也需要DEF来规范导出符号的名字。

论坛徽章:
0
发表于 2010-08-30 22:53 |显示全部楼层
只会linux,没碰到需要写def的情况,编译成so就能用。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2010-08-31 01:00 |显示全部楼层
Windows下用Def是为了提供一个“Regular”的函数名
这样:
extern "C" __declspec(dllexport) int sum(int a,int b){
        return a+b;
}

然后用头文件Sum.h
extern "C"  int sum(int a,int b)
是可以的。但你用Depends看看产生的文件名,它类似于
sum@8

这对于C语言是没有问题的,因为C语言的命名规范是这样的,但Windows下还有像VB这种东西,此时,我们希望它产生和语言无关的函数名,形如:
sum
后面没有@8这种“乱码”
则可以直接使用DEF文件,写做下面格式:

EXPORT
  sum=sum@8
;或
;sum=sum

此外,DEF文件可以提供别名,比如“:
sum=sum@8
sumab=sum@8
此时,虽然sum函数只有一个,但你可以使用
sum(5,3)
或是
sumab(5,3)

论坛徽章:
0
发表于 2010-08-31 11:42 |显示全部楼层
ls的解释太tmd转业了,我白活了这么多年......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP