我目前正在开发一个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。编译选项为:
输出文件位于fortran代码的项目文件夹中,以供将来调试:
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。输出和结论
我的结论是,我没有以正确的方式执行多变量DLL函数y2调用。您执行这种呼叫的方式是什么?
我目前正在开发一个fortran DLL,但我对多变量函数有疑问。我的最终目标是从VBA调用DLL函数,使用调用...
问题出在“ libdll_thermo.a”链接上。遵循here的教程后,我发现我应该已链接“ libdll_thermo.dll”。现在可以使用。