如何实现CC++代码中调用Fortran编写的DLL?

2026-05-22 14:211阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1025个文字,预计阅读时间需要5分钟。

如何实现C/C++代码中调用Fortran编写的DLL?

【混合编程】C/C++ 调用 Fortran 的 DLL + 简单加法器为例,介绍 C/C++ 调用 Fortran 语言 DLL 的操作过程:

1.Fortran 操作 1.1:Fortran 代码

首先实现加法功能: fortran ! 加法函数 SUBROUTINE add(a, b, c) INTEGER, INTENT(IN) :: a, b INTEGER, INTENT(OUT) :: c c=a + b END SUBROUTINE add

2.函数功能实现:

如上代码,实现两个整数的加法运算。

3.函数调用示例:

fortran INTEGER :: a, b, c a=5 b=3 CALL add(a, b, c) PRINT *, 'The sum is:', c

C/C++调用Fortran的DLL

以一个简单的加法器为例,介绍C/C++调用Fortran语言DLL的操作过程

一、Fortran操作 1.1 Fortran代码

首先是加法功能的实现,如下代码

!函数功能 两数相加 SUBROUTINE Summator(a,b,c) REAL a REAL b REAL c c=a+b END

这是一般在fortran环境下运行的常规格式,为了生成dll,并且被C/C++调用,对以上代码进行编辑修改

如何实现C/C++代码中调用Fortran编写的DLL?

!函数功能 两数相加 SUBROUTINE Summator(a,b,c) !DEC$ATTRIBUTES DLLEXPORT::SUMMATOR REAL a[VALUE] !此处[VALUE]是必须的,传入的参数值需作此声明,否则会引发读取访问权限冲突的异常 REAL b[VALUE] REAL c c=a+b END

其中

!DEC$ATTRIBUTES DLLEXPORT::SUMMATOR

也可用以下形式替换

!MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF 1.2 Dll工程文件建立

使用VS软件,可以通过->建立DLL框架:

在新项目下将编辑好的代码添加,编译链接得到 TESTFOR.dll文件。

二、C / C++调用

调用方式有3种,此处只介绍其中一种显示调用方法,其他方式可参照链接

(7条消息) C/C++调用FORTRAN编写的DLL_fengyhack的博客-CSDN博客

首先需要将第一步生成的 .dll 文件Copy到当前C++所在工程目录下,并对函数进行声明

#include<iostream> #include <windows.h> using namespace std; typedef void(*SUMMATOR)(float a, float b, float *c);

在C++工程文件中进行调用

int main(){ //第一步,加载fortran下生成的dll文件 HINSTANCE hLibrary = LoadLibrary(TEXT("TESTFOR.dll")); //判断是否加载成功 if (hLibrary == NULL) { cout << "Cannot open lib" << endl; system("pause"); return -1; } //第二步,从加载的结果 hLibrary 中查找函数并命名 SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR"); //判断是否查找到函数 if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; system("pause"); return -2; } //第三步,调用 float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); //调用函数 cout << c << endl; //输出计算的c FreeLibrary(hLibrary); //释放Library system("pause"); return 0; } 三、完整代码 3.1 Fortran代码部分

!函数功能 两数相加 SUBROUTINE Summator(a,b,c) !MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF REAL a[VALUE] REAL b[VALUE] REAL c c=a+b END !函数功能 两个数组相加 SUBROUTINE SummatorArray(array1,array2,array3,n) !MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATORArray !MS$ENDIF INTEGER n[VALUE] INTEGER i REAL,DIMENSION(n)::array1 REAL,DIMENSION(n)::array2 REAL,DIMENSION(n)::array3 do i=1,n array3(i)=array1(i)+array2(i) end do END 3.2 C代码

#include<iostream> #include<windows.h> using namespace std; typedef void(*SUMMATOR)(float a, float b, float *c); typedef void(*SUMMATORARRAY)(float *array1, float *array2, float *array3,int n); int main() { //加载dll函数 HINSTANCE hLibrary = LoadLibrary(TEXT("TESTFOR.dll")); if (hLibrary == NULL) { cout << "Cannot open dll" << endl; system("pause"); return -1; } SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR"); if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; system("pause"); return -2; } float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); cout << c << endl; SUMMATORARRAY summatorArray = (SUMMATORARRAY)GetProcAddress(hLibrary, "SUMMATORARRAY"); if (summatorArray == NULL) { cout << "Cannot find 'SUMMATORARRAY' function" << endl; system("pause"); return -2; } int n = 3; float *array1 = (float*)calloc(n, sizeof(float)); float *array2 = (float*)calloc(n, sizeof(float)); float *array3 = (float*)calloc(n, sizeof(float)); for (int i = 0; i < n; i++) { array1[i] = i; array2[i] = i * i; } summatorArray(array1, array2, array3, n); for (int i = 0; i < n; i++) { cout << array1[i]<<"+"<<array2[i]<<"="<< array3[i]<<endl; } FreeLibrary(hLibrary); free(array1); free(array2); free(array3); system("pause"); return 0; }

运行结果

标签:dll

本文共计1025个文字,预计阅读时间需要5分钟。

如何实现C/C++代码中调用Fortran编写的DLL?

【混合编程】C/C++ 调用 Fortran 的 DLL + 简单加法器为例,介绍 C/C++ 调用 Fortran 语言 DLL 的操作过程:

1.Fortran 操作 1.1:Fortran 代码

首先实现加法功能: fortran ! 加法函数 SUBROUTINE add(a, b, c) INTEGER, INTENT(IN) :: a, b INTEGER, INTENT(OUT) :: c c=a + b END SUBROUTINE add

2.函数功能实现:

如上代码,实现两个整数的加法运算。

3.函数调用示例:

fortran INTEGER :: a, b, c a=5 b=3 CALL add(a, b, c) PRINT *, 'The sum is:', c

C/C++调用Fortran的DLL

以一个简单的加法器为例,介绍C/C++调用Fortran语言DLL的操作过程

一、Fortran操作 1.1 Fortran代码

首先是加法功能的实现,如下代码

!函数功能 两数相加 SUBROUTINE Summator(a,b,c) REAL a REAL b REAL c c=a+b END

这是一般在fortran环境下运行的常规格式,为了生成dll,并且被C/C++调用,对以上代码进行编辑修改

如何实现C/C++代码中调用Fortran编写的DLL?

!函数功能 两数相加 SUBROUTINE Summator(a,b,c) !DEC$ATTRIBUTES DLLEXPORT::SUMMATOR REAL a[VALUE] !此处[VALUE]是必须的,传入的参数值需作此声明,否则会引发读取访问权限冲突的异常 REAL b[VALUE] REAL c c=a+b END

其中

!DEC$ATTRIBUTES DLLEXPORT::SUMMATOR

也可用以下形式替换

!MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF 1.2 Dll工程文件建立

使用VS软件,可以通过->建立DLL框架:

在新项目下将编辑好的代码添加,编译链接得到 TESTFOR.dll文件。

二、C / C++调用

调用方式有3种,此处只介绍其中一种显示调用方法,其他方式可参照链接

(7条消息) C/C++调用FORTRAN编写的DLL_fengyhack的博客-CSDN博客

首先需要将第一步生成的 .dll 文件Copy到当前C++所在工程目录下,并对函数进行声明

#include<iostream> #include <windows.h> using namespace std; typedef void(*SUMMATOR)(float a, float b, float *c);

在C++工程文件中进行调用

int main(){ //第一步,加载fortran下生成的dll文件 HINSTANCE hLibrary = LoadLibrary(TEXT("TESTFOR.dll")); //判断是否加载成功 if (hLibrary == NULL) { cout << "Cannot open lib" << endl; system("pause"); return -1; } //第二步,从加载的结果 hLibrary 中查找函数并命名 SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR"); //判断是否查找到函数 if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; system("pause"); return -2; } //第三步,调用 float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); //调用函数 cout << c << endl; //输出计算的c FreeLibrary(hLibrary); //释放Library system("pause"); return 0; } 三、完整代码 3.1 Fortran代码部分

!函数功能 两数相加 SUBROUTINE Summator(a,b,c) !MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF REAL a[VALUE] REAL b[VALUE] REAL c c=a+b END !函数功能 两个数组相加 SUBROUTINE SummatorArray(array1,array2,array3,n) !MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATORArray !MS$ENDIF INTEGER n[VALUE] INTEGER i REAL,DIMENSION(n)::array1 REAL,DIMENSION(n)::array2 REAL,DIMENSION(n)::array3 do i=1,n array3(i)=array1(i)+array2(i) end do END 3.2 C代码

#include<iostream> #include<windows.h> using namespace std; typedef void(*SUMMATOR)(float a, float b, float *c); typedef void(*SUMMATORARRAY)(float *array1, float *array2, float *array3,int n); int main() { //加载dll函数 HINSTANCE hLibrary = LoadLibrary(TEXT("TESTFOR.dll")); if (hLibrary == NULL) { cout << "Cannot open dll" << endl; system("pause"); return -1; } SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR"); if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; system("pause"); return -2; } float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); cout << c << endl; SUMMATORARRAY summatorArray = (SUMMATORARRAY)GetProcAddress(hLibrary, "SUMMATORARRAY"); if (summatorArray == NULL) { cout << "Cannot find 'SUMMATORARRAY' function" << endl; system("pause"); return -2; } int n = 3; float *array1 = (float*)calloc(n, sizeof(float)); float *array2 = (float*)calloc(n, sizeof(float)); float *array3 = (float*)calloc(n, sizeof(float)); for (int i = 0; i < n; i++) { array1[i] = i; array2[i] = i * i; } summatorArray(array1, array2, array3, n); for (int i = 0; i < n; i++) { cout << array1[i]<<"+"<<array2[i]<<"="<< array3[i]<<endl; } FreeLibrary(hLibrary); free(array1); free(array2); free(array3); system("pause"); return 0; }

运行结果

标签:dll