采用vs.net+ifort做一个简单的dll,当然是从help里面拷出来的。
SUBROUTINE ARRAYTEST(arr)
!DEC$ ATTRIBUTES DLLEXPORT :: ARRAYTEST
REAL(4) arr(3, 7)
INTEGER i, j
DO i = 1, 3
DO j = 1, 7
arr (i, j) = 11.0 * i + j
END DO
END DO
END SUBROUTINE
存成mydll.f90,用dynamic link library的project进行build,ok,没问题。然后新建一个console的project,取名testdll,把mydll.lib和mydll.dll复制到testdll目录下,然后再考一个例程:
INTERFACE
SUBROUTINE ARRAYTEST (rarray)
!DEC$ ATTRIBUTES DLLIMPORT :: ARRAYTEST
REAL rarray(3, 7)
END SUBROUTINE ARRAYTEST
END INTERFACE
real(4) arr(3, 7)
call arraytest(arr)
print*, arr
end
取名test.f90,然后project->properties->linker->advanced library:输入mydll.lib,编译,说arraytest没有被定义(error LNK2019:...)给mydll.lib加上绝对路径,仍然不行。咋回事呢?
查了一下彭国伦的fortran90程设,发现问题是在既便我加了采用上述方法让工程找mydll.lib,由于该路径没有加入到lib path里,所以根本不会找到mydll.lib.是不是加了lib path就可以呢?测试表明,加了也找不到。:( 最后,采用彭指出的,也是最简单的方法。直接把mydll.lib加入到project里,一起显式编译,因为mydll.dll在系统可以找到的目录里,所以最后build成功,执行正常。
当然test.f90也可以写成更简单的形式:
!DEC$ ATTRIBUTES DLLIMPORT :: ARRAYTEST
real(4) arr(3, 7)
call arraytest(arr)
print*, arr
end
***一个问题是:如果和与ms-vs6.0相链接,如果以上的dll被C语言调用,那么,会出现编译没问题,但执行时初始化失败,分析是!DEC的问题。如何解决,还没深入分析。