参考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程序----动态链接方式的更多相关文章

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

    一.C++动态调用Fortran DLL (1)创建FORTRAN DLL工程,生成forsubs.dll文件供调用. ! forsubs.f90 ! ! FUNCTIONS/SUBROUTINES ...

  2. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...

  3. 利用ctypes调用Fortran程序

    本来python下面调用fortran最傻瓜方便的办法就是f2py,但是若fortran和C混合编程的代码,分别指定gfortran和gcc为编译器,在windows下面f2py直接报错 那么ctyp ...

  4. 实例分析ELF文件动态链接

    参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第6章 可执行文件的装载与进程 第7章 动态链接 <Linux GOT与PLT> 开发平台 ...

  5. [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口

    1 平台 转http://blog.csdn.net/misskissc/article/details/43063419 1.1 硬件 Table 1. 硬件(lscpu) Architecture ...

  6. JVM_ 动态链接

    虚拟机栈: -> 栈帧---对应每个方法----> 包含: 局部变量表, 本地方法栈, 动态链接, 方法出口, 动态链接: 每个栈帧都保存了 一个 可以指向当前方法所在类的 运行时常量池, ...

  7. 原创 C++应用程序在Windows下的编译、链接(四)动态链接

    4动态链接 4.1概述 在静态链接阶段,链接器为PE文件生成了导入表,导出表,符号表,并调整了Call指令后面的操作数,在程序调用的时候,能够直接地或者间接地定位到IAT中的某个位置,在PE文件中,该 ...

  8. 程序的链接和装入及Linux下动态链接的实现

    http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行 ...

  9. 程序员的自我修养九Windows下的动态链接

    9.1 DLL简介 DLL即动态链接库的缩写,它相对于Linux下的共享对象. Windows下的DLL文件和EXE文件实际上是一个概念,它们都是有PE格式的二进制文件. 微软希望通过DLL机制加强软 ...

随机推荐

  1. js时间小总结

    1.js获取时间 var myDate = new Date(); 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份 ...

  2. LNMP第二部分nginx、php配置

    内容概要:一. nginx.confvim /usr/local/nginx/conf/nginx.conf //清空原来的配置,加入如下内容:user nobody nobody;worker_pr ...

  3. 80端口被system进程占用解决方法

    今天启动Apache的时候老是提示失败,很简单,使用 netstat -ano 发现80端口被占用.如图所示: 按照PID 来说:在任务管理器中查看PID 的进程名 既然是system.那么 应该不回 ...

  4. javascriptMVC框架面向对象编程

    //抽象形状类 $.Class("Shape", {}, { //构造函数 init : function(edge) { this.edge = edge; }, //实例方法 ...

  5. 单元测试 2 & 初识模块3

    单元测试 - 创建测试用例 单元测试是什么? (老鸟可以无视下面这段话.) hi,新同学们,咱们的PHP代码里满布着好多函数和类,经常互相调用,你改的一个函数/方法可能是"比较底层" ...

  6. 2017.11.15 linux软件安装管理(todo)

    学习来自:http://www.imooc.com/learn/447 第一章 介绍 第二章 软件包简介 1.源码包 2.二进制包(RPM包或系统默认包) 脚本安装包其实是别人把软件安装的脚本写好了, ...

  7. Ruby中map, collect,each,select,reject,reduce的区别

    # map 针对每个element进行变换并返回整个修改后的数组 def map_method arr1 = ["name2", "class2"] arr1. ...

  8. 倍福TwinCAT(贝福Beckhoff)应用教程12.3 TwinCAT控制松下伺服 NC进阶

    在前面一节,我们简单介绍了通过PLC+HMI实现完整控制松下伺服的上使能-运动,采集位置,速度等功能,这里我们会大量简化用到的贝福功能块(为了更加实用).首先依然是对单个轴的封装,我们之前的做法,例如 ...

  9. IOS Appstore价格表

  10. sqlite3 解决并发读写冲突的问题

    #include "stdafx.h" #include "sqlite3.h" #include <iostream> #include < ...