【问题标题】:how to call dll in fortran如何在fortran中调用dll
【发布时间】:2018-06-03 04:39:29
【问题描述】:

我有一个 dll 文件,其中包含一个函数“ProcessWeather”,并想在 fortran 代码中调用该函数,如下所示:

PROGRAM myprog
!DEC$ ATTRIBUTES DLLIMPORT :: EPLUSWTH


INTERFACE

  SUBROUTINE ProcessWeather(InType,OutType,InFileName,OutFileName,ErrFlag)

    CHARACTER(len=*), INTENT(IN) :: InType       ! InputFile Type
    CHARACTER(len=*), INTENT(IN) :: OutType      ! OutputFile Type
    CHARACTER(len=*), INTENT(IN) :: InFileName   ! InputFile Name (Full path)
    CHARACTER(len=*), INTENT(IN) :: OutFileName  ! OutputFileName (Full path)
    REAL(4), INTENT(OUT)  :: ErrFlag      ! If errors are found,
                                                 ! set to true and put
                                                 ! description put in file.
 END SUBROUTINE
END INTERFACE
END PROGRAM

dll 文件放置在我放置 fortran 文件的相同位置。 当我编译fortran代码时,出现以下错误: 未定义对 processweather 的引用_

任何建议都将受到高度赞赏。

【问题讨论】:

  • 这只是接口 - 实现是否也编译到 DLL 中?
  • 不,我没有 dll 文件的源代码,而且我真的不知道如何在 fortran 代码中引用 dll 文件,因为我对 fortran 完全陌生。你能告诉我怎么做吗?
  • 您可以使用依赖或任何 dll Walker 之类的应用程序来检查例程信息。另外,它可以互操作吗?它是否有任何后缀或前缀(如下划线或@)?传递机制是什么,stdcall还是cdecl...?
  • 我没有太多关于 DLL 的信息,而是函数名和参数列表。因此,我不确定是否可以提供您提到的信息。顺便问一句,!DEC$ ATTRIBUTES DLLIMPORT :: EPLUSWTH 在 gfortran 中是否有任何努力?
  • 那个特定的 $DEC 或 $MS 指令只是告诉链接器在查找表中粘贴什么,以便在链接器尝试链接程序或运行时时可以找到 DLL 中的函数loader 尝试在加载时动态链接程序。

标签: dll fortran


【解决方案1】:

如果您使用 gfortran 进行编译(正如您的评论所暗示的那样),!$DEC 指令将被忽略。但是你可以使用GCC directives,即ATTRIBUTES指令,并在其中声明属性DLLIMPORT。

您也可以只使用标准的bind(C, name="the_name")。另外,据我记得,GCC 在创建 DLL 时不需要任何属性来使符号在外部可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多