在Fortran90模块中将函数声明为变量? ifort说是的,gfortran说不

时间:2015-03-21 04:07:42

标签: fortran gfortran intel-fortran

我目前正在两个不同的编译器上测试一个Fortran模块(在linux机器上是ifort,在Mac上是gfortran),而且我遇到了一个我无法解释的奇怪问题。

我有一个带有一个公共子程序的简单模块和两个私有的函数。它看起来像这样:

module test
implicit none
private
public :: publicsub

contains

subroutine publicsub(x,y,arg)
implicit none
integer(kind=4), intent(in):: x,y
real(kind=8),   intent(out):: arg

arg = func1(x)*10. / func2(y)

end subroutine publicsub

integer(kind=4) function func1(x)
implicit none
integer(kind=4), intent(in):: x

func1 = x*x;

end function func1

integer(kind=4) function func2(x)
implicit none
integer(kind=4),intent(in):: x

func2 = x*x*x

end function func2
end module test

以下是要测试的主要程序:

program sgtest

use test

implicit none  
integer(kind=4) :: a,b
real(kind=8) :: output

a = 3
b = 4

call publicsub(a,b,output)

write *, output

end program sgtest 

我可以单独使用ok来编译模块。当我编译主程序时,它不会在我的linux盒子上的ifort编译器下编译,除非我还在主子例程publicsub,I.E.中将函数调用声明为整数,我将此代码添加到publicsub:

integer(kind=4) :: func1,func2

然后它运作得很好。但是,当我在我的mac上的gfortran上编译它时,我收到了以下错误消息:

  

架构x86_64的未定义符号:

 "_func1_", referenced from:
     ___test_MOD_publicsub in ccnj2Zt6.o
 "_func2_", referenced from:
     ___test_MOD_publicsub in ccnj2Zt6.o
     

ld:找不到架构x86_64的符号      collect2:错误:ld返回1退出状态

但是当我对此声明发表评论时,所有内容都会按照预期与gfortran进行编译和运行。具有讽刺意味的是,我在没有这些声明的情况下从linux框中的ifort收到类似的错误消息。

那么这里发生了什么?这是Fortran90 / 95与GNU Fortran扩展问题,还是我在结构上做了一些与模块禁止的事情?

1 个答案:

答案 0 :(得分:1)

我们无法解决您在原始代码中出错的原因,因为您没有显示主程序。但要回答标题中的问题:

执行此操作时:

subroutine publicsub(x,y,arg)
  integer(kind=...), intent(in):: x,y
  real(kind=...),   intent(out):: arg
  !!
  integer(kind=...) :: func1,func2
  !!

  arg = func1(x) * 10 / func2(y)

end subroutine publicsub

您声明func1func2与模块中的func1func2的外部函数不同

由于模块外部没有此类外部函数,链接器无法找到它们,链接以错误结束。

添加的行绝对不应该存在。