Fortran Coder

查看: 8395|回复: 8
打印 上一主题 下一主题

[编译器] 生成dll没有lib

[复制链接]

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
楼主
发表于 2015-4-5 11:43:55 | 显示全部楼层
本帖最后由 vvt 于 2015-4-5 11:48 编辑

1.每个函数加 !DEC$ 就可以了,其实你需要导出的函数应该只是一小部分,大量的函数应该是内部使用的。
2.不管什么调用DLL,都可以有lib,也可以没有lib。
3.调用DLL有两种方式,第一是隐式调用(通过LoadLibrary和GetProcAddress函数获得函数入口),第二是显式调用(通过lib文件告诉编译器函数入口)
注意,在某些教科书里面,这两种调用的名字可能是颠倒的,也就是第一种叫显式,第二种叫隐式。事实上,这个命名应该是根据可执行文件是否有显示的导入表(第二种方式)而言的,而不是根据源代码。
4.上述第一种方式不需要 lib,第二种方式需要 lib。Fortran 调用 Fortran,C++调用Fortran 均可以用这两种方式。
5. 如果商业软件的DLL,你能猜测到函数的参数个数,每个参数的含义,当然可以调用它,非常可能。当然,还有一个前提,就是这个软件并没有对DLL进行验证或加密。
(商业软件有无限种针对DLL的验证)
6. 用别人的DLL,可以用第一种调用方式。也可以用第二种调用方式(这种情况下,没有lib文件,你可以自己创建一个工程,按照猜测的函数定义好,但函数内部是空白的或者随便写点代码,编译得到lib文件,之后删除你编译的DLL,只使用编译后的lib文件和别人的DLL)。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2015-4-5 14:33:29 | 显示全部楼层
不不不,lib 文件其实是若干函数的集合。
在这些函数里,有的是函数的实体(即二进制机器码的函数的实现,一般的像IMSL,MKL静态函数库是这种性质),有的是函数入口的指引(这种叫导入库,生成dll时生成的lib一般是这种性质)

.mod 文件有点像C语言的 .h 文件,是文件头,让编译器知道这些东西是什么,函数需要多少参数,每个参数是什么类型。

举个例子,你不知道什么是“电脑”,去查字典。这里的字典就像 .mod 文件。
查完字典,你知道什么是“电脑”了,但是要去哪里买电脑?你得查地图,这里的地图就像 lib(导入库)
查到地图以后,你真正的去买了个电脑。OK,这就是DLL了。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
板凳
发表于 2015-4-5 16:55:14 | 显示全部楼层
本帖最后由 vvt 于 2015-4-5 16:56 编辑

是的,如果没有module,则编译器不知道函数有多少参数,每个参数是什么类型。

在这种情况下,万一出现不匹配,就会duang,duang出错,内存无法写啊,非法操作啊,程序初始化失败啊,而编译器无法预知。
(如果像你说的那样,你开始去猜商业DLL的函数,则当你猜错的时候,就会发现这些错误了。而商业DLL不会给你提供 .mod 文件~~)

所以,我推荐用 module,这样如果不匹配,编译器会温柔地告诉你:“参数不一致哦,亲”

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-6-12 04:01

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表