回 帖 发 新 帖 刷新版面

主题:求助,如何生成和使用含 MODULE 的 DLL ?

MODULE可以像 Function 和 subroutine一样 生成 DLL吗?

如何生成? 需要使用 !DEC$ ATTRIBUTES DLLEXPORT :: 吗?
生成以后如何使用呢? 例如,在主程序里调用MODULE里的函数时,如何声明?

有没有关于FORTRAN动态链接库的书呢?

回复列表 (共23个回复)

沙发

书没有,而且不同的编译器动作也不一样。

板凳


嗯,那要是想了解比较特别的编译功能的话,网上有没有资料呢,或者编译器的帮助文件里有没有?

谢谢

3 楼

不同的编译器有不同的样例,也有不同的处理方式,自带的帮助及网上的参考都很OK的。

4 楼

以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 楼


只把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 楼

你把Module编译到DLL里后,它就不是对DLL之外的Module了。

7 楼

command line 編譯:

ifort /dll module.f90
ifort main.f90 module.lib

8 楼


嗯,所以DLL里面编译的都是子程序和函数,才好被别的语言调用,是因为别的语言有可能不能识别FORTRAN里面的MODULE了?

但是如果特殊情况,需要把被别的语言调用的函数写在MODULE里,生成DLL,那如何使用DLL里的MODULE呢?

9 楼


多谢,请问command line在哪设置?
这个两行命令是设置编译器的命令吗,是什么意思?

我想学习下编译器方面的知识,不知道liangrong有什么这方面推荐的书或资料吗?

谢谢,谢谢

10 楼

windows 版的編譯器通常安裝後就會在開始菜單裡創建一個
自動設置 environment variables 的 batch file
command line 及 IDE 在 compiler document 裡的說明會比較清楚

我来回复

您尚未登录,请登录后再回复。点此登录或注册