c++调用fortran程序中遇到的问题
2016-01-20 11:13
671 查看
一、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和mkl_avx2.dll这三个动态库。查找了一下在 C:\Program Files (x86)\Intel\Composer XE 2013 SP1\redist\ia32\mkl里边,为以防万一,可以把mkl里边的dll全拷进来。 加进去就ok了。
相关文章推荐
- C语言再学习之数据类型
- C++中内存分配详解
- 1010. Radix (25)
- C++ std::pair<>
- 重学C++ (六) 标准IO库
- c语言中的static
- c++程序猿经典面试题
- c++中的243、251、250错误原因
- C++设计模式——单例模式
- C++之路进阶——可持续化线段树(Couriers)
- C++之路进阶——(可持续化线段树)
- 关于 C++ 框架、库和资源的一些汇总列表
- C++模板(二)
- C语言冒泡排序法心得
- VC++ 中使用内存映射文件处理大文件
- c++模板(一)
- Qt & C++变量类型装换
- 论“使用C++非内置全局变量的风险”
- 解决VTune错误.../lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ...)
- thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)