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

2023-11-20 17:20

本文主要是介绍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:编译和调用动态链接库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396222

相关文章

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装