主题:求助,如何生成和使用含 MODULE 的 DLL ?
heizaoniangao
[专家分:310] 发布于 2011-07-31 14:59:00
MODULE可以像 Function 和 subroutine一样 生成 DLL吗?
如何生成? 需要使用 !DEC$ ATTRIBUTES DLLEXPORT :: 吗?
生成以后如何使用呢? 例如,在主程序里调用MODULE里的函数时,如何声明?
有没有关于FORTRAN动态链接库的书呢?
回复列表 (共23个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-07-31 21:05:00
书没有,而且不同的编译器动作也不一样。
板凳
heizaoniangao [专家分:310] 发布于 2011-08-01 00:02:00
嗯,那要是想了解比较特别的编译功能的话,网上有没有资料呢,或者编译器的帮助文件里有没有?
谢谢
3 楼
cgl_lgs [专家分:21040] 发布于 2011-08-01 10:16:00
不同的编译器有不同的样例,也有不同的处理方式,自带的帮助及网上的参考都很OK的。
4 楼
liangrong [专家分:2090] 发布于 2011-08-01 17:25:00
以IVF為例, 子程序中需要加上 !dec$ attributes dllexport
例如:
program 1:
program main
use m
write (*, *) f(1.0)
end program main
program 2:
module m
contains
real function f (x) result (val)
implicit none
!dec$ attributes dllexport :: f
real, intent(in) :: x
val = x*2.0
end function f
end module m
5 楼
heizaoniangao [专家分:310] 发布于 2011-08-03 06:06:00
只把MODULE里的函数或者子程序 加上 编译命令就可以了吗?
我试了下
1 新建DLL项目,把PROGRAM1加进去,生成
2 新建CONSOLE APPLICATION项目把PROGRAM2加进去,然后把第一步生成的LIB和DLL拷贝到PROGRRAM2同目录文件夹里,把LIB添加到这个项目里,调试
调试报错,ERROR IN OPENING THE COMPILED MODULE FILE. CHECK INCLUDE PATHS.
我觉得原因是,如果把MODULE编译到DLL文件里面,然后在PROGRAM里调用DLL里的MODULE时,直接用USE 加MODULE NAME是不行的。不知道有什么可以实现这个目的的。
6 楼
cgl_lgs [专家分:21040] 发布于 2011-08-03 09:50:00
你把Module编译到DLL里后,它就不是对DLL之外的Module了。
7 楼
liangrong [专家分:2090] 发布于 2011-08-03 11:09:00
command line 編譯:
ifort /dll module.f90
ifort main.f90 module.lib
8 楼
heizaoniangao [专家分:310] 发布于 2011-08-03 11:09:00
嗯,所以DLL里面编译的都是子程序和函数,才好被别的语言调用,是因为别的语言有可能不能识别FORTRAN里面的MODULE了?
但是如果特殊情况,需要把被别的语言调用的函数写在MODULE里,生成DLL,那如何使用DLL里的MODULE呢?
9 楼
heizaoniangao [专家分:310] 发布于 2011-08-03 11:14:00
多谢,请问command line在哪设置?
这个两行命令是设置编译器的命令吗,是什么意思?
我想学习下编译器方面的知识,不知道liangrong有什么这方面推荐的书或资料吗?
谢谢,谢谢
10 楼
liangrong [专家分:2090] 发布于 2011-08-03 12:17:00
windows 版的編譯器通常安裝後就會在開始菜單裡創建一個
自動設置 environment variables 的 batch file
command line 及 IDE 在 compiler document 裡的說明會比較清楚
我来回复