为几个语句函数构建代码时出现未定义的引用错误
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" 函数 contain
ed 传递给模块过程,而不是语句函数。
您尝试将语句函数移动到模块本身是第二个子问题。您不能在模块中定义语句函数。它不能在 contains
语句之前,也不能在之后(在标准中,它们分别受到限制)。
很难看出将主程序中的语句函数更改为模块的完整函数(在contains
之后)会失去任何东西。
我在构建代码时收到几个语句函数的“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" 函数 contain
ed 传递给模块过程,而不是语句函数。
您尝试将语句函数移动到模块本身是第二个子问题。您不能在模块中定义语句函数。它不能在 contains
语句之前,也不能在之后(在标准中,它们分别受到限制)。
很难看出将主程序中的语句函数更改为模块的完整函数(在contains
之后)会失去任何东西。