因为最近要做对比实验,需要在别人的的开源Fortran工程中调用我所用的C++算法,
故在此记录方便进行回顾(其实并不会,正经人谁用Fortran啊)
环境:VS2019 + Intel Fortran Compiler
1 对C++程序的修改
1.1 可以将需要的函数提炼到单独.cpp和.h文件中,不允许存在main函数
1.2 __declspec(dllexport):将函数名存储在.dll的导出表中
1.3 C++中变量名和函数名的大小写问题需要看具体编译器
1.4 分别生成.dll和.lib文件,并拷贝出来
__declspec(dllexport)可以将函数名暴露给外界,而C++因为重载名称问题导致失效,所以需要extern C
如果在linux下用GCC编译,好像可以不通过extern C的方法,只在C++函数名后+下划线就行?没试
test.h
#include <iostream>
#define DllExport __declspec( dllexport )
#ifdef __cplusplus
extern "C"
{
DllExport void printnum(int*);
DllExport int max(int, int);
}
#endif
test.cpp
#include "test.h"
int max(int a, int b)
{
return std::max(a, b);
}
void printnum(int* num)
{
printf("打印num:%d", *num);
}
2 对Fortran程序的修改
main.f90
program main
implicit none
! 声明接口进行参数调用
interface
function print(a) bind(c,name = "printnum")
use,intrinsic::iso_c_binding ! 绑定方法,并声明绑定函数为自带方法,需要提前use
integer,intent(in)::a ! 因为Fortran默认地址传递,原函数的形参是指针类型,所以不用加value
end function print
end interface
interface
function max(a,b) bind(c) ! 如果函数名一样,可以不使用name
use,intrinsic::iso_c_binding
integer,intent(in),value::a,b ! intent(in)声明形参只读,value声明按值传递
integer::max ! 声明返回值,需要和函数名一样
end function max
end interface
integer::a = 10,b = 99
print*,print(max(a,b)) ! 判断大小并打印
pause
end program main