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