用fortran链接多个文件

时间:2014-06-10 19:48:24

标签: file fortran external subroutine

我是Fortran的新手,但我正试图找到一种方法,我可以从我编写的程序中检索信息,而不将它们作为我的新文件中的子程序包含在内。到目前为止,我的新文件中有4个子程序,我希望能够将半径输入到所有4个并接收各自的输出。

这是我的代码的基本格式 - 基本上我想表明我需要4个独立的程序才能获得当前程序表达式所需的所有变量。 到目前为止,我已经尝试使用include和call表达式,但是他们无法检索我需要的信息以便返回到我的文件中,并且他们提出了“不适用”的答案。

program practicedynamo

    implicit none

    real:: A,B,C, Radius

    real::Bsquared,Vsquared

    read*,radius

    call programA(radius,A)

    call programB(radius,B)

    call programC(radius,C)


    Vsquared=(1.0/3.0)*B

    Bsquared= 4*pi*density*Vsquared

    gradient=radius*C

    Rvector=Bsquared*Vsquared*gradient

    ThetaVector=Rvector*sin(A)

end program practicedynamo

!and then my four subroutines would be placed afterwards
!here is an example of one of my subroutines within my actual code (the version above has been simplified and I've changed the variables)

subroutine testdensity(radius,density)

implicit none

    real::radius,x,sunradius,density

   if (radius>0.and.radius<=695500000) then

        sunradius=695500000

        x=radius/sunradius

        density=((519*x**4.0)-(1630*x**3.0)+(1844*x*x)-(889*x)+155)

        print*,"                                             "

        density=density*1000

        print*,"the density is",density, "kg per meters cubed"

    else

        print*, "this radius is not an option for the sun"

    end if

end subroutine testdensity

1 个答案:

答案 0 :(得分:5)

您还没有提到如何编译代码,但这里有一些将多个源文件包含在单个可执行文件中的一般方法。您不需要包含文件,您可以单独编译它们并将它们链接在一起。建议编写一个Makefile来执行此操作,您可以在其他地方找到大量示例。

要将多个文件编译为一个可执行文件,只需在编译时将它们全部列出

gfortran -o output programA.f90 programB.f90 programC.90 mainprogram.f90

如果您不想将它们全部编译在一起或在构建时必须重新编译,则可以编译单个对象,例如

gfortran -c -o programA.o programA.f90
gfortran -c -o programB.o programB.f90
gfortran -c -o programC.o programC.f90

然后链接为

gfortran -o output mainprogram.f90 programA.o programB.o programC.o

如果您正在尝试使用库并希望程序A-C位于独立库中,您可以先按上述方法编译对象,然后

ar rcs libABC.a programA.o programB.o programC.o

然后将主程序编译为

gfortran -o output mainprogram.f90 libABC.a 

如果您没有使用模块,那么您将负责确保对外部子例程的调用与外部文件中声明的接口匹配。为了安全并让编译器捕获不匹配参数的问题,您可以在程序中声明显式接口,或者将外部代码放入模块中,并将use模块放在主程序中。