在Linux环境下,使用ifortran编译 带有结构的和.inc头文件 的fortran项目生成.so文件

news/2024/11/17 6:44:13/

在Linux环境下,使用ifortran编译 带有结构的和.inc头文件 的fortran项目生成.so文件

    • 1 致谢
    • 2 参考文章和手册
    • 3 需求描述
      • 3.1 文件结构
      • 3.2 文件调用关系
    • 4 主程序改造为函数
    • 5 项目编译方法
      • 5.1 方案一 直接对所有.f90源文件进行编译
        • 5.1.1 具体实现
        • 5.1.2 注意事项
      • 5.2 方案二 编译时使用 -I 参数指定头文件路径进行编译
        • 5.2.1 具体实现
        • 5.2.2 注意事项
    • 6 生成.so文件后的注意事项

1 致谢

Godzilla_BB

DOSKEY_jason

2 参考文章和手册

在linux下安装fortran编译器详细教程

linux下gfortran 生成so文件

Intel® Fortran Compiler User and Reference Guides.pdf

3 需求描述

一个复杂的fortran项目 编译成一个对外暴露函数 接口的 .so文件 供外部调用。

3.1 文件结构

该项目共15个文件,包含13个.f90源文件和2个定义常量声明的.inc文件。

3.2 文件调用关系

其中13个源文件中1个是主程序(带有program关键字),其他12个为模块化调用的函数function和子程序subroutine。
并且主程序和子模块或函数间有一定的调用关系,且这13个.f90源文件中某些引用了.inc文件,以加载常量声明(即:出现了include 'xxx.inc’的加载外部文件的语句)

示例调用关系如下:
在这里插入图片描述

4 主程序改造为函数

由于主程序是program关键字编写的,进行部分改造,使主程序源文件 变成一个函数function的f90源文件。

源主程序代码示例

program TPKx1! ...end program

改造成函数后代码示例

integer function TPKx1()!program TPKx1! ...!end programTPKx1 = 9999return end function

5 项目编译方法

5.1 方案一 直接对所有.f90源文件进行编译

借助 ifortran编译器 编译时 将当前路径作为默认搜索路径的特点

5.1.1 具体实现

文件路径结构

将所有.f90文件和所有.inc文件放置于同一个文件夹下。

在Linux环境下,在该文件夹中打开shell终端,

输入命令(此时终端的路径为放置所有文件的文件夹路径)

ifort -fPIC -shared -o 目标文件名.so ./*.f90

释义

ifort 使用ifort编译器进行编译

-fPIC 编译器产生与位置无关代码(Position-Independent Code)

-shared -o 生成共享文件(shared object)

目标文件名.so 指定需要生成的.so文件的名称

./*.f90 指定需要参与编译的源文件为: 当前路径下所有以.f90后缀结尾的文件

5.1.2 注意事项

① 带有include ‘xxx.inc’ 代码的 f90源文件,在编译时,虽然没有指定参与编译的’xxx.inc’文件,但是由于编译器默认会在当前目录下寻找所需的 'xxx.inc’文件,然在f90源文件中相应的地方展开,所以最终可以成功编译出需要的.so文件。

② 虽然将所有的f90文件和inc文件置于同一文件夹下,但是编译时,选择 参与编译的文件只能是所有的.f90文件因为.inc文件 ifortran编译器无法辨识。即:发生 file format not recognized for xxx .inc警告,导致编译.so文件失败。
若使用如下命令,

ifort -fPIC -shared -o 目标文件名.so ./*

警告示例
在这里插入图片描述

5.2 方案二 编译时使用 -I 参数指定头文件路径进行编译

5.2.1 具体实现

文件路径结构

将所有.f90文件放入 A 文件夹下, 在A文件夹下新建include文件夹,将所有.inc文件放入A文件夹下的include文件夹

输入命令(此时终端的路径显示为A文件夹路径)

ifort -I ./include -fPIC -shared -o 目标文件名.so ./*.f90

释义

-I ./include 指定编译所需头文件的路径为 ./include 文件夹,即当前文件夹下的include文件夹

5.2.2 注意事项

输入编译命令时,打开的终端的路径为A文件夹时(此时A文件夹下有include文件夹), 告诉编译器

所需参与编译的文件应该为 ./*.f90 而不能是 ./*  (./* 表示当前文件夹下所有内容)

这样会导致编译器将 include文件夹这一对象也作为需要参与编译的文件,而导致无法识别文件夹发生错误。

警告示例
在这里插入图片描述

6 生成.so文件后的注意事项

将原主程序program, 改造成function函数后。在外部调用,

最终输出的.so文件中的TPKx1()函数, 函数名会发生改变,变成小写并添加下划线_ ,即:tpkx1_ 

具体检测方法
输入命令

nm 目标文件名.so

查看该.so文件对外暴露的函数接口 为 tpkx1_ , 在使用JNA进行调用时需要注意这一点,否则无法调用该函数成功。
在这里插入图片描述


http://www.ppmy.cn/news/598611.html

相关文章

Fortran入门——菜鸟级基础语法

前言: 最近需要自学Fortran,本人菜鸟,零基础,这篇文章也是帮助我自己更好的记住一些基础语法。所以,有Fortran基础的,可以跳过本篇啦~ 本文的环境是mingw vscode 哈 1.后缀 Fortran文件的后缀是 .f90(还…

Fortran编译初步

写在前面 注意:本文是关于 gfortran 的文章。如果你不清楚 gfortran,g77,g95 等等的概念的话,不妨看看GCC 的 Fortran 语言编译器介绍;如果你要用 g77 的话,这是一篇g77入门。 [编辑]Fortran 编程中相关文…

idea中有个目录不显示,磁盘中是有的

java项目src下有个目录data不显示 通过打开D盘看目录是有的,运行项目的时候报错,找不到目录下的文件。 解决方案: idea -> file -> seetings -> EDitor -> file types 打开页面后右侧显示有ignore files and folders 查看这里面有…

linux f95编译器,gfortran如何告诉我是否正在编译f90或f95代码?

gfortran可以从文件扩展名中猜出某些东西;如果文件的扩展名为.f,.f90,f95,.f03或.f08,则它将采用具有适当标准的固定(.f)或自由格式。但你可以强制它使用选项-std f2003编译(比方说)fortran2003代码。例如,来自docume…

笔记:CLM5.0模型运行一些参数

Introduction 因为研究涉及CLM和其他模型couple运行,需要把一些CLM运算的变量传递到另一个模型 . 主要涉及的数据都以type形式,罗列在$CESM/components/clm/src/main/clm_instMod.F90 相当于一个个结构体,里面包含很多歌变量 想找出具体…

在Abaqus中使用f90格式的子程序

Abaqus默认支持的是固定(fortran77)格式的Fortran子程序。编译或者调用子程序时会自动搜索文件后缀为:*.for, *.f, *.C, *.c, *.cc, *.CPP, *.cpp, *.CXX, *.cxx 的源代码文件。 如果想使用f90自由格式的Fortran子程序,需要修改Abaqus的环境配置文件。A…

C与Fortran之间的相互调用

此文章鸣谢 Dragon 竹叶知风飘 排名不分先后 运行环境 C/C编译器:MSVS2019(VC9),对VS2008也适用。 Fortran编译器:Intel Visual Fortran Compiler 11.0,IVF的其它版本也适用。 C调用Fortran函数 一、…

Fortran——安装软件

1、下载并安装Notepad,添加环境变量,如D:\Program\Notepad,环境变量中不能出现空格; 2、下载并安装MinGW,下载地址MinGW官网,安装过程中会弹出MinGW Installation Manager界面,进行如下操作&…