C++ 如何在DLL/XLL中从Fortran调用C函数

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,并

我想分享如何从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++,对吗?这里到底有什么问题/错误?我只是在分享。。。