我目前正在两个不同的编译器上测试一个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扩展问题,还是我在结构上做了一些与模块禁止的事情?
答案 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
您声明func1
和func2
与模块中的func1
和func2
的外部函数不同。
由于模块外部没有此类外部函数,链接器无法找到它们,链接以错误结束。
添加的行绝对不应该存在。