继续关于dll的最后一个未解决的问题,我尝试使用g95使用以下命令创建fortran dll:
g95 -c FCall.f90
g95 -shared -mrtd -o FCall.dll FCall.o
当我将它链接到VB时,它显示"无法找到名为' FortranCall'的入口点。在DLL' C:\ Users \ Hp \ Documents \ Visual Studio 2010 \ Projects \ WindowsApplication5 \ WindowsApplication5 \ FCall.dll'。"
这是FORTRAN代码:
SUBROUTINE FortranCall (r1, num)
!DEC$ ATTRIBUTES DLLEXPORT :: FortranCall
!DEC$ ATTRIBUTES ALIAS:'FortranCall' :: FortranCall
REAL,INTENT(IN) :: r1
REAL,INTENT(OUT) :: num
num = MOD (r1, 256.0)
END SUBROUTINE
这是VB代码:
Private Sub Command1_Click()
r1 = 456.78
Call FortranCall(r1, Num)
Text1.Text = Str$(Num)
End Sub
VB中的模块代码:
Declare Sub FortranCall Lib"C:\Users\Hp\Documents\Visual Studio 2010\Projects\WindowsApplication5\WindowsApplication5\FCall.dll"
(r1 As Single, Num As Single)
G95是否有自己的导出语句从dll导出函数? 在这个子程序中,导出属性(!DEC $ ATTRIBUTES DLLEXPORT :: FortranCall)用于视觉堡垒
答案 0 :(得分:4)
您使用的指令是高度编译器特定的东西。甚至这个名字也暗示它特定于DEC编译器(以及后代 - Compaq和Intel)。
Gfortran有同样的事情,但是!$GCC
,而不是G95。
我强烈建议您使用Fortran 2003功能bind(C,name="name")
来设置符号名称。另请参阅标记https://stackoverflow.com/questions/tagged/fortran-iso-c-binding。
SUBROUTINE FortranCall (r1, num) bind(C,name="FortranCall")
!DEC$ ATTRIBUTES DLLEXPORT :: FortranCall
END SUBROUTINE
默认情况下,GCC和G95都会导出符号,不需要dllexport
指令,但请将其保留在英特尔Fortran中。
或者,您可以尝试选项-fno-underscoring
,但这又是g95特有的,不适用于其他编译器。