码迷,mamicode.com
首页 > 编程语言 > 详细

c++调用fortran程序中遇到的问题

时间:2016-01-20 13:04:29      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

一、C++动态调用Fortran DLL

 (1)创建FORTRAN DLL工程,生成forsubs.dll文件供调用。

技术分享
!  forsubs.f90 
!
!  FUNCTIONS/SUBROUTINES exported from FORSUBS.dll:
! FORSUBS      - subroutine 
!
INTEGER*4 FUNCTION Fact (n)
   !DEC$ ATTRIBUTES DLLEXPORT::Fact
      INTEGER*4 n [VALUE]
      INTEGER*4 i, amt
      amt = 1
      DO i = 1, n
        amt = amt * i
      END DO
      Fact = amt
   write(*,*)"Mixed calls succeed!"
END
SUBROUTINE Pythagoras (a, b, c)
   !DEC$ ATTRIBUTES DLLEXPORT::Pythagoras
      REAL*4 a [VALUE]
      REAL*4 b [VALUE]
      REAL*4 c [REFERENCE]
      c = SQRT (a * a + b * b)
END
技术分享

注意:!DEC$ ATTRIBUTES DLLEXPORT::Fact这一句很重要,如果没有这一句的话,C++程序找不到这个接口。

(2)创建win32 console application,调用forsubs.dll。

技术分享
/*     File CMAIN.C   */
//C++显式调用FORTRAN动态链接库

#include <stdio.h>
#include <iostream.h>
#include <windows.h>

main()
{
 //声明调用约定
 typedef int (_stdcall * FACT)(int n); 
 typedef void (_stdcall * PYTHAGORAS)(float a, float b, float *c); 
 //加载动态库文件
 HINSTANCE hLibrary=LoadLibrary("forsubs.dll"); 
 if(hLibrary==NULL)
 {
  cout<<"can‘t find the dll file"<<endl;
  return -1;
 }

 //获得Fortran导出函数FACT的地址
 FACT fact=(FACT)GetProcAddress(hLibrary,"FACT"); 
 if(fact==NULL)
 {
  cout<<"can‘t find the function file."<<endl;
  return -2;
 }

 //获得Fortran导出函数PYTHAGORAS的地址
 PYTHAGORAS pythagoras=(PYTHAGORAS)GetProcAddress(hLibrary,"PYTHAGORAS"); 
 if(pythagoras==NULL)
 {
  cout<<"can‘t find the function file."<<endl;
  return -2;
 }


    float c;
    printf("Factorial of 7 is: %d\n", fact(7));
    pythagoras (30, 40, &c);
    printf("Hypotenuse if sides 30, 40 is: %f\n", c);
    FreeLibrary(hLibrary); //卸载动态库文件
    return 0;

}
技术分享

 

二、调试Fortran DLL

设置Fortran程序的项目属性,Debugging->Command中,设置为测试程序的EXE文件路径。

 

 技术分享

设置Command之后,直接调试Fortran DLL 项目即可

上文的c++部分编译的话提示找不到iostream.h

改为

#include<iostream>
using namespace std;

就可以编译通过了

debug的时候遇到问题

技术分享

 

原因是调用方式出了问题,应该把

typedef int (_stdcall * FACT)(int n); 改为
 typedef int (_cdecl * FACT)(int n); 
这样的话debug就不会出现上述错误了。

还有一个问题:我用fortran编的程序里边用了imsl库,如果什么库都没用的话直接把生成的dll拷到debug目录下就可以了,但是我加了库,debug的时候就提示我缺少 mkl_intel_thread.dll和mkl_core.dll这两个动态库。查找了一下在
C:\Program Files (x86)\Intel\Composer XE 2013 SP1\redist\ia32\mkl里边
加进去就ok了。


c++调用fortran程序中遇到的问题

标签:

原文地址:http://www.cnblogs.com/lianjiehere/p/5144440.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!