编译具有多个部分的Fortran程序

joh*_*hnv 5 fortran fortran90 intel-fortran

我对Fortran和整个英特尔编译器都非常陌生(我使用基于Windows的英特尔编译器和没有Visual Studio集成的IMSL库,因此只能使用命令行).

问题应该非常简单:我需要编译一个Fortran程序,它存储为四个不同的源代码部分.主程序(和一些子程序)存储在名为central.for的代码文件中,还有三个文件,我们称之为s1.for,s2.for和s3.for,每个文件只包含一个子程序(让称他们为sub1-sub3)而没有主程序.主程序调用存储在s1-s3和central.for中的子程序.

问题是我该如何编译它:

当我尝试编译central.for时,它给出了error LNK2019: unresolved external symbol _SUB1 referenced in function _MAIN__.同样,它为SUB2和SUB3提供相同的消息.

当我尝试编译s1.for-s3.for时,它给出了 error LNK2019: unresolved external symbol _MAIN__ referenced in function _main

很明显,我需要以某种方式链接它们.但是,我不知道怎么做

Jon*_*rsi 3

您需要先编译程序的各个部分而不先链接,然后将它们全部链接在一起。所以你的命令行将如下所示:

ifort /c s1.for
ifort /c s2.for
ifort /c s3.for
ifort /c central.for
Run Code Online (Sandbox Code Playgroud)

其中 the是;/c的缩写。也会起作用。这将分别生成文件 s1.o、s2.o、s3.o 和central.o。上述可以按任意顺序完成。现在各个部分链接在一起,您将执行类似的操作/compile-only/nolink

ifort /exe:central.exe central.o s1.o s2.o s3.o
Run Code Online (Sandbox Code Playgroud)

构建可执行文件。

请注意,如果您正在编译使用模块的现代 Fortran 代码,并且(例如)central.for 中的主程序有一行类似 的代码,那么这会变得更加复杂use s2。在这种情况下,您必须在central之前编译(即使使用/c)s2;当你在这种情况下编译 s2 时,你会得到一个额外的输出文件 s2.mod。编译central.for 需要s2.mod 文件。但考虑到文件扩展名,这可能是较旧的代码,模块可能不是问题。