使用多变量函数时,Fortran DLL错误

问题描述 投票:1回答:1

我目前正在开发一个fortran DLL,但我对多变量函数有疑问。我的最终目标是

  • 从VBA调用DLL函数
  • 使用调用DLL函数的fortran代码调试DLL

这是我的简化情况:

1。 Fortran DLL代码

module mod_thermo

    implicit none

contains

    function y1(x1) result(y) bind(c, name = "Y1")
        use iso_c_binding, only : c_double
        !GCC$ attributes dllexport, stdcall :: y1
        real(c_double) :: x1
        real(c_double) :: y

        y = 2.d0 * x1

    end function

    function y2(x1, x2) result(y) bind(c, name = "Y2")
        use iso_c_binding, only : c_double
        !GCC$ attributes dllexport, stdcall :: y2
        real(c_double) :: x1
        real(c_double) :: x2
        real(c_double) :: y

        y = 2.d0 * x1 * x2

    end function

end module

2。具有GCC的Fortran DLL编译选项

编译器是GCC。编译选项为:

  • -静态(以避免依赖于其他dll)
  • -Wl,-kill-at(与VBA相关)
  • -fno-下划线(与VBA相关)

输出文件位于fortran代码的项目文件夹中,以供将来调试:

  • dll_thermo.dll
  • libdll_thermo.a
  • libdll_thermo.def

3。用于DLL测试的Fortran代码(接口和程序)

通过喜欢库libdll_thermo.a]将DLL链接到代码上>

module mod_thermo

    implicit none

    interface

        function y1(x1) result(y) bind(c,name="Y1")
            use iso_c_binding, only : c_double
            real(c_double) :: x1
            real(c_double) :: y
        end function

        function y2(x1, x2) result(y) bind(c,name="Y2")
            use iso_c_binding, only : c_double
            real(c_double) :: x1
            real(c_double) :: x2
            real(c_double) :: y
        end function
    end interface

end module

program main

    use mod_thermo
    implicit none

    write(*,*)"y1 calls:"
    write(*,*)y1(1.d0) ! output ok
    write(*,*)y1(2.d0) ! output ok
    write(*,*)y1(3.d0) ! output ok

    write(*,*)"y2 calls:"
    write(*,*)y2(1.d0, 1.d0) ! output ok
    write(*,*)y2(2.d0, 2.d0) ! output fails
    write(*,*)y2(3.d0, 2.d0)

end program

4。输出和结论

Fail when performing Y2 second call

我的结论是,我没有以正确的方式执行多变量DLL函数y2调用。您执行这种呼叫的方式是什么?

我目前正在开发一个fortran DLL,但我对多变量函数有疑问。我的最终目标是从VBA调用DLL函数,使用调用...

dll fortran gfortran fortran-iso-c-binding
1个回答
0
投票

问题出在“ libdll_thermo.a”链接上。遵循here的教程后,我发现我应该已链接“ libdll_thermo.dll”。现在可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.