为几个语句函数构建代码时出现未定义的引用错误

Undefined reference error during building the code for a couple of statement functions

我在构建代码时收到几个语句函数的“Undefined reference error to ...”错误。编译成功。

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

        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 中已经过时,我建议您考虑避免使用它们。

但是,您的第一个子问题并不是真正针对语句函数,而是针对范围。您的函数在主程序中是 declared/defined:您不能期望它们在与该程序关联的模块中可用,就像您期望变量一样。使用关联则相反,使模块中的实体在主程序(或其他使用模块的东西)中可用。

语句函数与内部过程略有不同,因为它们不能作为模块中过程引用的实际参数。您可以将主程序中的 "proper" 函数 contained 传递给模块过程,而不是语句函数。

您尝试将语句函数移动到模块本身是第二个子问题。您不能在模块中定义语句函数。它不能在 contains 语句之前,也不能在之后(在标准中,它们分别受到限制)。

很难看出将主程序中的语句函数更改为模块的完整函数(在contains之后)会失去任何东西。