Function 为两个语句函数生成代码时出现未定义的引用错误

Function 为两个语句函数生成代码时出现未定义的引用错误,function,build,module,fortran,fortran90,Function,Build,Module,Fortran,Fortran90,在构建代码时,我收到两个语句函数的“未定义引用错误…”错误。它编译成功 在定义了必要的参数和维度之后,我的程序代码部分从下面的语句函数开始。此外,我在模块的包含部分中还有其他函数/子程序 PROGRAM ...... DIMENSIONS bla bla !***** FUNCTIONS ***** !***FREE ENERGIES PER VOLUME OF INDIVIDUAL PHASES FL(X)=(

在构建代码时,我收到两个语句函数的“未定义引用错误…”错误。它编译成功

在定义了必要的参数和维度之后,我的程序代码部分从下面的语句函数开始。此外,我在模块的
包含
部分中还有其他函数/子程序

        PROGRAM ......
        DIMENSIONS bla bla

        !***** FUNCTIONS *****
        !***FREE ENERGIES PER VOLUME OF INDIVIDUAL PHASES

        FL(X)=((1.-X)*GCU_L+R*T*((1.-X)*DLOG(1.-X)))
        DFI(X)=2.*CC*(X-0.435)/VM

        *****************************
        VM=20.65D-6  
        R=8.3145     
        T=250. + 273.  
        TEMP=T
        GCU_L=5194.277+120.973331*T

        bla bla 

        END PROGRAM
我收到的生成错误:

  gfortran -Wall -o "123456" "123456.f90" (in directory: /Geany)
  /tmp/ccwapaHQ.o: In function `__mymodule_MOD_fsteady':
  123456.f90:(.text+0x7e3a): undefined reference to `fl_'
  123456.f90:(.text+0x7ea9): undefined reference to `dfi_'
  **DELETED THE REST**
  collect2: error: ld returned 1 exit status
  Compilation failed.
我认为将语句函数复制到模块的包含部分可能会解决错误。但是,它会产生以下编译错误

      gfortran -Wall -c "123456.f90" (in directory: /Geany)
      Compilation failed.
      123456.f90:523.127:
      FL(X)=((1.-X)*GCU_L+R*T*((1.-X)*DLOG(1.-X)))
                                           1

      DFI(X)=2.*CC*(X-0.435)/VM
                                 1
      Error: Unexpected STATEMENT FUNCTION statement in CONTAINS section at (1)
      123456.f90:1332.16:
        USE myModule
            1
      Fatal Error: Can't open module file 'mymodule.mod' for reading at (1): No such file or directory

首先要指出的是,语句函数在当前FORTRAN中是过时的,我建议你们考虑避免使用它们。 然而,您的第一个子问题实际上并不特定于语句函数,而是范围。您的函数是在主程序中声明/定义的:您不能期望它们在与该程序相关联的模块中可用,就像您期望变量可用一样。使用关联则相反,使模块中的实体在主程序(或使用模块的其他东西)中可用

语句函数与内部过程稍有不同,它们不能是模块中过程引用的实际参数。您可以将主程序中的“适当”函数
contain
ed传递给模块过程,而不是语句函数

您尝试将语句函数移动到模块本身中是第二个子问题。不能在模块中定义语句函数。它不能在
包含的
语句之前,也不能在后面(在标准中,每个语句都有限制)


很难看出,如果将主程序中的语句函数更改为模块的完整函数(在
包含
之后),您会丢失任何内容。

我猜在第一种情况下,您在模块
mymodule
中的过程
fsteady
中引用了
fl
。你能确认一下吗,给我看看吗?是的。你是对的。那我该怎么办呢?在模块中可以有语句函数,但只能在包含的过程中。不是“裸体”,谢谢。你回答了我脑海中的许多问题。除第三段外,我理解你所有的段落。此外,我意识到有时人们在模块之外的任何地方使用CONTAIN,我不知道这意味着什么…
contains
在其他地方引入了可以传递的内部过程(以F2008的方式)。最近你可以看到一个关于这个的问题。