无法找到入口点Fortran Dll

时间:2014-08-06 13:10:02

标签: visual-studio-2010 dll fortran entry-point

继续关于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)用于视觉堡垒

1 个答案:

答案 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特有的,不适用于其他编译器。