Fortran Coder

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

[编译器] 生成dll没有lib

[复制链接]

123

帖子

32

主题

0

精华

宗师

F 币
1562 元
贡献
795 点
跳转到指定楼层
楼主
发表于 2015-4-5 10:52:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有一个项目,之前没想用dll形式调用的。现在想生成dll,非要一个一个子程序加上   !dec$ attributes dllexport , ALIAS:...    吗?能不能在编译器选项里面统一设置?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

123

帖子

32

主题

0

精华

宗师

F 币
1562 元
贡献
795 点
沙发
 楼主| 发表于 2015-4-5 11:04:39 | 只看该作者
还有两个问题,
1.Fortran调用Fortran的dll,是不是除了dll 一定还需要lib和mod(如果用了module)?“用C++等调用fortran的dll就不用lib”这个说法对吗?
2.我现在只有一个商业软件带的dll的话,猜测里面可能有些很好的函数/子程序,想调用他们可能吗?

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)。

123

帖子

32

主题

0

精华

宗师

F 币
1562 元
贡献
795 点
地板
 楼主| 发表于 2015-4-5 14:18:08 | 只看该作者
继续请教: lib文件用来告诉编译器函数入口,那.mod文件是做什么用的呢?

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

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

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

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

123

帖子

32

主题

0

精华

宗师

F 币
1562 元
贡献
795 点
6#
 楼主| 发表于 2015-4-5 16:32:27 | 只看该作者
大概理解了。但是有点疑惑:不是用module编译才会有.mod的吗?那如果没有用module,编译器就不需要知道函数需要多少参数,每个参数是什么类型?

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
7#
发表于 2015-4-5 16:55:14 | 只看该作者
本帖最后由 vvt 于 2015-4-5 16:56 编辑

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

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

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

123

帖子

32

主题

0

精华

宗师

F 币
1562 元
贡献
795 点
8#
 楼主| 发表于 2015-4-6 00:16:31 | 只看该作者

哈哈,这回明白了。
十分感谢您耐心细致的讲解!

100

帖子

0

主题

0

精华

专家

F 币
550 元
贡献
291 点

规矩勋章元老勋章

QQ
9#
发表于 2015-4-6 18:06:24 | 只看该作者
本帖最后由 百事可乐 于 2015-4-6 18:07 编辑

其实 lib 库里也有一些关于函数接口(参数个数,类型) 的定义,但是不够全面.(基本上是针对所有的语言特征,因为 lib 文件是各种语言都会用到的)

而 .mod 里面的接口则更详细。包括 Fortran  独有的接口特征(比如 Intent  属性,假定形状等),mod 文件也是 fortran 独有的。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-16 17:38

Powered by Tencent X3.4

© 2013-2024 Tencent

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