首页 文章

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

提问于
浏览
5

我对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

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

2 回答

  • 0

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

    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;当你在这种情况下编译s2时,你就会出现问题 .

  • 3

    这就是我做到的 . 每个支持函数都在静态库中编译 . 然后在主程序项目中添加一个现有项并选择静态库 .lib 文件(从编译输出) . 只是调用函数,就好像它们的源代码是主代码的一部分(使用 CALL MYLIBFUN()

    祝好运 .

相关问题