windows下fortran 与C++混合编程的探索


百度后,找到相关资源,最好的一篇是:https://www.cnblogs.com/ljwan1222/p/9546244.html

我的环境如下: windows下 VS环境,IVF环境

例1: 基本的结构

1. C++ 动态库结构

(1)头文件

#ifdef __cplusplus
extern "C" {
#endif

extern void __stdcall MOMENT_NEW(int* a);   //子过程, 没有__stdcall前缀也可以
extern int __stdcall AFUNC();         //函数, 没有__stdcall前缀也可以
extern double __stdcall BFUNC(bool);

//#define moment_new MOMENT_NEW       //将函数名改为小写,使用define转为大写,失败
//#define afunc AFUNC
//#define bfunc BFUNC

#ifdef __cplusplus
}
#endif

#endif //F_LIB_H

(2)cpp文件

// moment.cpp
void MOMENT_NEW(int* a)
{
    a++;
}

int AFUNC()
{
    return 10;
}

double BFUNC(bool a)
{
    return 3;
}

(3)def文件

LIBRARY f_lib
EXPORTS
MOMENT_NEW @1
AFUNC @2
BFUNC @3

2. fortran 主程序结构

program main
    use iso_c_binding     !这个根据资料是必要的,通过试验,可能不需要
    implicit none

    type(c_ptr) :: foo
interface  f_lib1    !用一个interface引入C++库的相关内容,名称可以任意
    subroutine MOMENT_NEW(a)     !函数名必须相同,包括参数类型要对应 
    implicit none
    integer::a            !声明参数类型
    end subroutine MOMENT_NEW

    integer(4) function AFUNC() 
    implicit none
    end function AFUNC
    
    real(8) function BFUNC(c)
    implicit none
    logical::c
    end function BFUNC

    ! type(c_ptr) :: a
    end interface f_lib1
    integer(4) jd
    real(8) js

    call MOMENT_NEW(4)

    jd = AFUNC()
    js = BFUNC(.TRUE.)
    write(*,*) jd, js
end

 例2: 使用字符串

1. C++ 动态库结构

(1)头文件

extern double __stdcall BFUNC(char* str);

(2)实现

double BFUNC(char* str)
{
    cout << str << endl;
    return 0.;
}

1. fortran主程序

    real(8) function BFUNC(str)
    implicit none
    character(100)::str     !fortran中的字符串大小是固定的
    end function BFUNC

    ! type(c_ptr) :: a
    end interface f_lib1
    integer(4) jd
    real(8) js
    character(100)::str;

    call MOMENT_NEW(4)

    jd = AFUNC()
    str = 'I can do it';
    js = BFUNC(str)
    write(*,*) jd, js

相关