回 帖 发 新 帖 刷新版面

主题:急求:module中的全局变量在windows中如何编译成dll

小弟最近在尝试将一个FORTRAN打包成DLL。因为要使用一个allocatable的数组做为全局变量,所以希望把module中的全局变量做成dll,然后以其它的进程调用。发现按照CVF6.6中帮助文档提供的方法,怎么也不能将module中的全局变量打包到dll中去。
我用的编译器是CVF6.6,是在命令行环境中编译程序。
为了学习fortran的DLL编译方法,我写了两段小代码,如下:
**** modll.f90 *****
      module global
        implicit real(kind(1.d0)) (a-h,o-z)
        !DEC$ ATTRIBUTES DLLEXPORT :: x, n
        allocatable :: x(:)
        integer :: n
      end module global
--------------------------------------------------
**** test.f90 ****
      program test
      use global
!
      n = 5
      allocate(x(n))
      do i = 1, n
        x(i) = 10.d0*sin(3.14/real(i))
      enddo
      write(*,"('the array x is: ',/,10(5x,5f10.4,/))") (x(i),i=1,n)
      end
---------------------------------------------------
我在命令行的编译命令是:
df /dll /align:all modll.f90
df /align:all test.f90 modll.lib
结果给出的错误是:
objA8E1.tmp : error LNK2001: unresolved external symbol _GLOBAL_mp_X
objA8E1.tmp : error LNK2001: unresolved external symbol _GLOBAL_mp_N
test.exe : fatal error LNK1120: 2 unresolved externals

?????
请教这里的老师们和各位高手,这个问题我该怎么解决?


回复列表 (共3个回复)

沙发

还真是问题,cvf的不行,ivf的可以,按理说,同一个编译器这么调用是没有问题的。

板凳

是啊,我是按着CVF6.6的帮助文档来作的。文档中说:只要在module代码中,给相应的数据对象声明DLLEXPORT属性,即可在应用程序中通过USE语句正确调用module中的数据对象,并会自动分配DLLIMPORT的属性。
在我自己的机器上用命令行尝试过IVF,但编译后执行程序总是会报缺少MSVCR90.DLL的错误,所以就没用IVF编译了。更何况,我们课题组里都是用的CVF6.6。

3 楼

需要你在工程里加上那个MODULE。

我来回复

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