Fortran教程7:编译和调用动态链接库

编程入门 行业动态 更新时间:2024-10-09 17:27:16

Fortran教程7:编译和调用<a href=https://www.elefans.com/category/jswz/34/1755856.html style=动态链接库"/>

Fortran教程7:编译和调用动态链接库

文章目录

    • 编译dll
    • 调用dll
    • 数据类型对应
    • 在C语言中调用

前情提要:

  • 1 安装和编译💎 2 数据类型💎 3 过程和子过程💎 4 判断和循环
  • 5 数组💎 6 字符串💎7输入输出💎8 模块和包管理

编译dll

下面写个最简单的fortran的函数,实现整数加法

! 文件名 add_dll.f95
integer function add2i(x, y)integer, intent(in) :: x, yadd2i = x + y
end function add2i

然后在命令行中用gfortran编译,具体命令为

$ gfortran -c add_dll.f95
$ gfortran -shared -o add_dll.dll add_dll.o

其含义为,第一步通过源代码生成.o文件,第二步通过.o文件,得到add_dll.dll,完成动态链接库的编译。

调用dll

生成动态链接库之后,可先在fortran中小试一下,由于test2i是在外部定义的,所以在类型声明时,需要用到external关键字

! 文件名dll_test.f95
program dll_testimplicit noneinteger :: ainteger, external :: add2ia = add2i(1, 2)write (*,*) "1 + 2 = ", a  
end program dll_test

然后在编译的时候别忘了链接刚刚编好的dll,结果如下。

>gfortran -o test dll_test.f95 -L. add_dll.dll
>test.exe1 + 2 =            3

数据类型对应

一旦涉及到混合编程,第一步就是统一数据类型,C和fortran的基本类型对应如下表

Fortran 95C大小对齐
BYTEchar11
REALfloat44
INTEGERint44
LOGICALint44
CHARACTER xunsigned char11

fortran中可通过kind来调整整型或浮点型的位长,而在C中,则通过不同的关键字来表示。其中,

  • 实型real的4位、8位和16位,分别对应C中的float, double, long double
  • 整型integer的1、2、4、8位,分别对应C中的singed char, short, int, long long int
  • 逻辑logical的1、2、4、8位,与integer表现相同。

此外,字符串将被转化为数组,复数则被转换为结构体

Fortran 95C大小对齐
CHARACTER (LEN=n) xunsigned char x[n] ;n1
DOUBLE COMPLEX xstruct {double dr, di;} x;164/8
COMPLEX xstruct {float r,i;} x;84
COMPLEX (KIND=4) xstruct {float r,i;} x;84
COMPLEX (KIND=8) xstruct {double dr,di;} x;164/8
COMPLEX (KIND=16) xstruct {long double dr,di;} x;324/8/16

在C语言中调用

C语言调用动态链接库这个大家都很熟悉了,调用fortran生成的动态链接库也没有什么不同,但有三点需要注意

  1. 别把数据类型搞混,这个在上一节已经给出了对应关系
  2. 需要在fortran函数的后面添加一个下划线,所以add2i在C语言中调用时写为add2i_
  3. 需要将传入变量改为指针的形式
#include<stdio.h>
int add2i_(int*, int*);
int main(){int x=1, y=2;int a = add2i_(&x, &y);printf("1+2=%d", a);
}

然后编译运行

>gcc -o test.exe test.c -L./ -ladd_dll
>test
1+2=3

更多推荐

Fortran教程7:编译和调用动态链接库

本文发布于:2024-02-13 09:02:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1757604.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:动态链接库   教程   Fortran

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!