C++ 如何在DLL/XLL中从Fortran调用C函数
我想分享如何从DLL/XLL调用Fortran中的C/C++函数。实际上,我正在写一个Excel XLL项目来解决Excel中的方程。我接下来的步骤是从Fortran中实现Simplex、根查找和其他函数,这些函数将在Excel中由XLL而不是DLL调用 我使用VS2015在Code::Blocks中生成XLL(C++)和gfortran来编译Fortran代码 您需要使用gfortran/Mingw中的以下库来链接VS2015 C++中的代码:我在VS2015中使用了文件.a而不是.lib,并且没有引起问题:C++ 如何在DLL/XLL中从Fortran调用C函数,c++,excel,fortran,gfortran,fortran-iso-c-binding,C++,Excel,Fortran,Gfortran,Fortran Iso C Binding,我想分享如何从DLL/XLL调用Fortran中的C/C++函数。实际上,我正在写一个Excel XLL项目来解决Excel中的方程。我接下来的步骤是从Fortran中实现Simplex、根查找和其他函数,这些函数将在Excel中由XLL而不是DLL调用 我使用VS2015在Code::Blocks中生成XLL(C++)和gfortran来编译Fortran代码 您需要使用gfortran/Mingw中的以下库来链接VS2015 C++中的代码:我在VS2015中使用了文件.a而不是.lib,并
libgcc.a, libgfortran.a, libmingwex.a, libmsvcrt.a, libpthread.a, libquadmath.a
C++代码:
prototypes:
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*pF_arg2)(double, double &);
double externo(pF_arg2 cfunk, double x);
void dobraC(double x, double &y); // call-back function
#ifdef __cplusplus
}
#endif
void dobraC(double x, double &y) // call-back function
{
y = x * 2;
}
__declspec(dllexport) double Dobra2x(double arg) // Fortran Interop
{
double x, y;
try
{
x = arg;
y = externo(&dobraC, x);
}
catch (...)
{
}
return y;
}
Fortran/GFortran代码如下:
real(c_double) FUNCTION externo(cfunk, x) bind(c, name = "externo")
use iso_c_binding
implicit none
! Define interface of call-back routine.
ABSTRACT INTERFACE
SUBROUTINE callback (x, y)
USE, INTRINSIC :: ISO_C_BINDING
REAL(KIND=C_DOUBLE), INTENT(IN), VALUE :: x
REAL(KIND=C_DOUBLE), INTENT(OUT) :: y
END SUBROUTINE callback
END INTERFACE
REAL(KIND=C_DOUBLE), INTENT(IN), VALUE :: x
REAL(KIND=C_DOUBLE) :: y
TYPE(C_FUNPTR), INTENT(IN), VALUE :: cfunk
PROCEDURE(callback), POINTER :: funk
! Convert C to Fortran procedure pointer.
CALL C_F_PROCPOINTER (cfunk, funk)
! Call it.
CALL funk(x, y)
externo = y
END FUNCTION externo
那么你的问题是什么?我在你的帖子里找不到任何问题。你的代码中有什么问题?你的标题提到C,你的问题提到C/C++,你把它标记为C++。如果你看到C++的代码,然后尝试用函数指针调用FORTRAN函数,然后在Fortran调用C++中的回调函数,然后返回一个C++,对吗?这里到底有什么问题/错误?我只是在分享。。。