C++调用Fortran程序----动态链接方式
参考http://yxbwuhee.blog.sohu.com/143577510.html
一、C++动态调用Fortran DLL
(1)创建FORTRAN DLL工程,生成forsubs.dll文件供调用。
! forsubs.f90
!
! FUNCTIONS/SUBROUTINES exported from FORSUBS.dll:
! FORSUBS - subroutine
!
INTEGER* FUNCTION Fact (n)
!DEC$ ATTRIBUTES DLLEXPORT::Fact
INTEGER* n [VALUE]
INTEGER* i, amt
amt =
DO i = , n
amt = amt * i
END DO
Fact = amt
write(*,*)"Mixed calls succeed!"
END
SUBROUTINE Pythagoras (a, b, c)
!DEC$ ATTRIBUTES DLLEXPORT::Pythagoras
REAL* a [VALUE]
REAL* b [VALUE]
REAL* 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;
;
}
//获得Fortran导出函数FACT的地址
FACT fact=(FACT)GetProcAddress(hLibrary,"FACT");
if(fact==NULL)
{
cout<<"can't find the function file."<<endl;
;
}
//获得Fortran导出函数PYTHAGORAS的地址
PYTHAGORAS pythagoras=(PYTHAGORAS)GetProcAddress(hLibrary,"PYTHAGORAS");
if(pythagoras==NULL)
{
cout<<"can't find the function file."<<endl;
;
}
float c;
printf());
pythagoras (, , &c);
printf("Hypotenuse if sides 30, 40 is: %f\n", c);
FreeLibrary(hLibrary); //卸载动态库文件
;
}
二、调试Fortran DLL
设置Fortran程序的项目属性,Debugging->Command中,设置为测试程序的EXE文件路径。

设置Command之后,直接调试Fortran DLL 项目即可。
C++调用Fortran程序----动态链接方式的更多相关文章
- c++调用fortran程序中遇到的问题
一.C++动态调用Fortran DLL (1)创建FORTRAN DLL工程,生成forsubs.dll文件供调用. ! forsubs.f90 ! ! FUNCTIONS/SUBROUTINES ...
- 关于C#调用非托管动态库方式的性能疑问
最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...
- 利用ctypes调用Fortran程序
本来python下面调用fortran最傻瓜方便的办法就是f2py,但是若fortran和C混合编程的代码,分别指定gfortran和gcc为编译器,在windows下面f2py直接报错 那么ctyp ...
- 实例分析ELF文件动态链接
参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第6章 可执行文件的装载与进程 第7章 动态链接 <Linux GOT与PLT> 开发平台 ...
- [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
1 平台 转http://blog.csdn.net/misskissc/article/details/43063419 1.1 硬件 Table 1. 硬件(lscpu) Architecture ...
- JVM_ 动态链接
虚拟机栈: -> 栈帧---对应每个方法----> 包含: 局部变量表, 本地方法栈, 动态链接, 方法出口, 动态链接: 每个栈帧都保存了 一个 可以指向当前方法所在类的 运行时常量池, ...
- 原创 C++应用程序在Windows下的编译、链接(四)动态链接
4动态链接 4.1概述 在静态链接阶段,链接器为PE文件生成了导入表,导出表,符号表,并调整了Call指令后面的操作数,在程序调用的时候,能够直接地或者间接地定位到IAT中的某个位置,在PE文件中,该 ...
- 程序的链接和装入及Linux下动态链接的实现
http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行 ...
- 程序员的自我修养九Windows下的动态链接
9.1 DLL简介 DLL即动态链接库的缩写,它相对于Linux下的共享对象. Windows下的DLL文件和EXE文件实际上是一个概念,它们都是有PE格式的二进制文件. 微软希望通过DLL机制加强软 ...
随机推荐
- python中下划线_的用途
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量 ...
- Python 转义html中以"&#"开头的字符
from HTMLParser import HTMLParser print HTMLParser().unescape('中国')
- Java 9的14个新特性总结
Java 9 包含了丰富的特性集.虽然Java 9没有新的语言概念,但是有开发者感兴趣的新的API和诊断命令. 我们将快速的,着重的浏览其中的几个新特性: 模块化系统–Jigsaw 项目 模块化是一 ...
- MPTCP 源码分析(四) 发送和接收数据
简述: MPTCP在发送数据方面和TCP的区别是可以从多条路径中选择一条 路径来发送数据.MPTCP在接收数据方面与TCP的区别是子路径对无序包 进行重排后,MPTCP的mpcb需要多所有子 ...
- Selenium webdriver Java 高级应用
对于这一段还蛮有感慨的,只想说,代码还是需要自己去敲的. 1. 改变用户代理 import org.junit.AfterClass; import org.junit.BeforeClass; im ...
- JAVA IO:Scanner类
使用Scanner类接收输入数据. JAVA提供了专门的输入数据类,此类可以完成BufferedReader类的功能,也可以方便的对输入数据进行验证,此类存放于JAVA.UTILL包中. 常用方法如下 ...
- 02-3设置第一启动项--进入BIOS设置USB方式启动
设置USB方式启动 https://zhinan.sogou.com/guide/detail/?id=1610014869 如何设置电脑从U盘启动呢?今天小编教大家如何进入BIOS设置USB方式启动 ...
- spring启动加载过程源码分析
我们知道启动spring容器两常见的两种方式(其实都是加载spring容器的xml配置文件时启动的): 1.在应用程序下加载 ApplicationContext ctx = new ClassPat ...
- sql 转 markdown
https://github.com/2liang/AutoBuildDocFromDB SQL脚本生成数据字典 http://www.jianshu.com/p/f491d0d3c503 这两个脚本 ...
- gm picture
console.log("ok") /*var images = require("images");var fs = require("fs&quo ...