动态链接库"/>
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 95 | C | 大小 | 对齐 |
---|---|---|---|
BYTE | char | 1 | 1 |
REAL | float | 4 | 4 |
INTEGER | int | 4 | 4 |
LOGICAL | int | 4 | 4 |
CHARACTER x | unsigned char | 1 | 1 |
在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 95 | C | 大小 | 对齐 |
---|---|---|---|
CHARACTER (LEN=n) x | unsigned char x[n] ; | n | 1 |
DOUBLE COMPLEX x | struct {double dr, di;} x; | 16 | 4/8 |
COMPLEX x | struct {float r,i;} x; | 8 | 4 |
COMPLEX (KIND=4) x | struct {float r,i;} x; | 8 | 4 |
COMPLEX (KIND=8) x | struct {double dr,di;} x; | 16 | 4/8 |
COMPLEX (KIND=16) x | struct {long double dr,di;} x; | 32 | 4/8/16 |
在C语言中调用
C语言调用动态链接库这个大家都很熟悉了,调用fortran
生成的动态链接库也没有什么不同,但有三点需要注意
- 别把数据类型搞混,这个在上一节已经给出了对应关系
- 需要在
fortran
函数的后面添加一个下划线,所以add2i
在C语言中调用时写为add2i_
- 需要将传入变量改为指针的形式
#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:编译和调用动态链接库
发布评论