使用多个部分编译Fortran程序

5

我对Fortran和整个Intel编译器的使用非常陌生(我正在使用基于Windows的Intel编译器,带有IMSL库但没有Visual Studio集成,因此只能通过命令行使用)。

问题应该非常简单:我有一个需要编译的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

显然,我需要以某种方式将它们链接起来。但是,我不知道该怎么做。

2个回答

3
你需要先编译程序的各个部分而不进行链接,然后再将它们全部链接在一起。因此,你的命令行应该像这样:
ifort /c s1.for
ifort /c s2.for
ifort /c s3.for
ifort /c central.for

其中/c是指/compile-only/nolink也可以使用。这将分别生成s1.o、s2.o、s3.o和central.o文件。上述步骤可以按任意顺序进行。现在,将各个单独的部分链接起来,您需要执行类似于以下的操作:

ifort /exe:central.exe central.o s1.o s2.o s3.o

构建可执行文件。

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


非常感谢!我认为所有4个部分都使用了IMSL库。因此,当我单独编译每个部分时,我应该包括IMSL链接选项,对吗?(即ifort /c central.for %link_fnl%)我按照您的步骤操作,成功得到了.exe文件,但是当我尝试运行可执行文件时,它返回一个程序异常-堆栈溢出错误。我做错了什么还是底层代码有问题?谢谢! - johnv
是的,您必须链接IMSL库。如果链接成功,则没有遗漏任何内容。因此,程序可能存在问题,或者构建过程仍然存在问题 - 例如32位而不是64位库等。 - Jonathan Dursi
在Visual Studio中是否有类似的功能呢?比如,创建一个只编译文件(生成.OBJ)的项目,然后其他项目将这些.OBJ文件作为依赖项并链接它们。 - gajo357

0
这是我是如何做的。每个支持函数都编译成一个静态库。然后在主程序项目中添加一个现有项,并选择静态库的.lib文件(编译输出)。然后,只需像主代码的一部分一样调用这些函数(使用CALL MYLIBFUN())。
祝好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接