C++调用Fortran的动态链接库

由于在前一段时间做一个课程设计,老师提供了一个函数的Fortran源码。虽然听说C和Fortran可以混合编程,但由于本人不会Fortran,就选择了将Fortran的源码编译成动态链接库,并在C++中调用。

Fortran编译动态链接库

*Fortran是在Intel官网下载的IVFhttps://software.intel.com/zh-cn/parallel-studio-xe

*VS2019https://www.visualstudio.com

在IVF安装完成之后,在VS2019中新建Fortran动态链接库项目,在想要输出到库函数的子程序下添加

!DEC$ ATTRIBUTES DLLEXPORT::FunctionName
SUBROUTINE MYPRINT(X)
!DEC$ ATTRIBUTES DLLEXPORT::MYPRINT
print *,X
end SUBROUTINE

执行生成之后,便会在相应的路径下得到.lib文件和.dll文件

C++调用Fortran动态链接库

在VS中建立C++空项目,在项目->属性->链接器->输入->附加依赖项 中加入需要调用的lib文件,然后将lib文件复制到项目的根目录。

首先是隐式调用

#pragma comment(lib,"Test.lib")

extern "C" void _cdecl MYPRINT(double *x);

int main()
{
    MYPRINT(3.1415);
    return 0;
}

由于在C++中使用C语言的调用约定所以需要extern "C",C语言中有两种堆栈管理方式分别为_stdcall和_cdecl,

_stdcall:参数由右向左压入堆栈,堆栈由函数自己清理。

_cdecl:参数由右向左压入堆栈,堆栈由调用方清理。

默认MSVC是_stdcall的方式,Fortran是_cdecl,因此有必要在此声明其堆栈管理方式。

其次是显示调用

#include <windows.h>
int main()
{
    typedef void(_cdecl* MYPRINT)(double *x);
    HINSTANCE hLibrary = LoadLibrary("Test.dll");
    MYPRINT myprint = (MYPRINT)GetProcAddress(hLibrary, "MYPRINT");
    myprint(3.1415);
    return 0;
}

注意:调用方的程序位数与版本需要与库保持一致

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值