Fortran Coder

查看: 701|回复: 8

[编译器] Linux下Intel Fortran多文件编译的问题

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
61 元
贡献
38 点
发表于 2021-7-31 15:05:31 | 显示全部楼层 |阅读模式
各位前辈好,想请教个关于在Linux系统下编译多个文件的问题(本萌新目前只会用命令行编译,然而要编译的文件有一百个左右)。
要编译的代码(课题组的闭源代码)在Windows下用VS能成功编译,但Linux下好像没有这样成熟的IDE,于是打算用VSCode或者makefile来处理。起初在VSCode里没有找到Intel Fortran相关的扩展内容,于是计划采用makefile。
我参考的makefile的格式大致如下图所示。
微信图片_20210731141936.png
要编译的文件主要包括一个声明中间变量的.fi文件,主程序代码的.f90文件,几个经过编译的.mod文件以及许多仅含subroutine的.f90文件。请问各位前辈MODSOURCE这里是否只能用写有module的.f90源文件而不是编译出来的.mod文件?仅写了subroutine的.f90文件是否也应该放在MODSOURCE这里和那些module的源文件一同编译呢? .fi文件应该如何处理呢?(我已尝试将.fi文件,.mod文件和除主程序之外的.f90都写在了MODSOURCE处,编译时直接提示.fi文件无法打开,随后报了许多错误。)
回复

使用道具 举报

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-7-31 20:44:34 | 显示全部楼层
声明中间变量的.fi文件是什么?是Fortran? 后缀很奇怪。只有module编译出来的.mod文件在MODSOURCE。仅写了subroutine的.f90文件放在SOURCE.

9

帖子

3

主题

0

精华

入门

F 币
61 元
贡献
38 点
 楼主| 发表于 2021-8-1 14:35:13 | 显示全部楼层
本帖最后由 joezhr 于 2021-8-1 14:39 编辑
风平老涡 发表于 2021-7-31 20:44
声明中间变量的.fi文件是什么?是Fortran? 后缀很奇怪。只有module编译出来的.mod文件在MODSOURCE。仅写了s ...

感谢前辈的指点~ .fi文件是一个Intel Fortran的Header file: fi.png

在该文件中声明了许多整型和双精度的变量,例如:
[Fortran] 纯文本查看 复制代码
Use Constant

Integer Nfact
Integer Nspecf
Integer Iasem
Double Precision Xjacb
...

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-8-2 07:59:42 | 显示全部楼层
joezhr 发表于 2021-8-1 14:35
感谢前辈的指点~ .fi文件是一个Intel Fortran的Header file:

在该文件中声明了许多整型和双精度的变量, ...

这是include文件,无需编译。在所需位置加 include filename即可。

9

帖子

3

主题

0

精华

入门

F 币
61 元
贡献
38 点
 楼主| 发表于 2021-8-2 09:36:39 | 显示全部楼层
风平老涡 发表于 2021-8-2 07:59
这是include文件,无需编译。在所需位置加 include filename即可。

前辈您好,按照您的建议我将主程序.f90文件和写有subroutine的.f90文件均放在了SOURCE后,所有.mod文件放在了MODSOURCE后,并在Makefile中增加了一句 -include filename.fi,保存并在终端执行make时提示缺失分隔符。

于是我用sed命令将各行开头的空格替换为了制表符,现在缺失分隔符的报错没有了,但是出现了如下错误:
filename.fi: 1: *** 配方在第一个目标前开始。 停止。
我在搜索引擎没找到相关的解决方法,想请问这是什么原因导致的呢?

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-8-2 18:59:31 | 显示全部楼层
joezhr 发表于 2021-8-2 09:36
前辈您好,按照您的建议我将主程序.f90文件和写有subroutine的.f90文件均放在了SOURCE后,所有.mod文件放 ...

include filename.fi 应该是在Fortran程序中, 而不是Makefile。 include是F77语句。

9

帖子

3

主题

0

精华

入门

F 币
61 元
贡献
38 点
 楼主| 发表于 2021-8-3 21:21:57 | 显示全部楼层
风平老涡 发表于 2021-8-2 18:59
include filename.fi 应该是在Fortran程序中, 而不是Makefile。 include是F77语句。

感谢前辈的回复,按照您的方法在主程序汇总增加了
[Fortran] 纯文本查看 复制代码
include 'filename.fi'

但由于这个.fi文件use了一个module,使用ifort编译时没有成功(照理说在一个module中或者头文件中引用另一个module应该是可行的吧?),现在打算直接把这个.fi文件中声明的变量直接分散写到其他的.f90文件中了,先尝试编译出来。
再次感谢前辈!

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-8-4 03:01:17 | 显示全部楼层
joezhr 发表于 2021-8-3 21:21
感谢前辈的回复,按照您的方法在主程序汇总增加了
[mw_shl_code=fortran,true]include 'filename.fi'[/mw ...

module必须在所有的定义语句之前。include语句是Fortran77的扩展,不是语言的一部分,不推荐使用。可用module代替。

9

帖子

3

主题

0

精华

入门

F 币
61 元
贡献
38 点
 楼主| 发表于 2021-8-4 16:27:44 | 显示全部楼层
风平老涡 发表于 2021-8-4 03:01
module必须在所有的定义语句之前。include语句是Fortran77的扩展,不是语言的一部分,不推荐使用。可用mo ...

了解了,多谢前辈
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2021-9-24 07:55

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表