【发布时间】:2015-05-24 14:33:16
【问题描述】:
我目前正在两个不同的编译器上测试 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 中将函数调用声明为整数,即,我将此代码添加到 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.old:未找到架构 x86_64 的符号 collect2:错误:ld 返回 1 个退出状态
但是当我注释掉这个声明时,所有的东西都会按照 gfortran 的预期编译和运行。具有讽刺意味的是,我在没有这些声明的 linux 机器上从 ifort 收到了类似的错误消息。
那么这里发生了什么?这是 Fortran90/95 vs GNU Fortran 扩展问题,还是我在结构上做了一些对模块不适用的事情?
【问题讨论】:
-
显示你的主程序。你
USE模块正确吗?您绝对不应该添加该行。另请参阅stackoverflow.com/questions/3170239/… 为什么不使用(kind=4)。 -
也不要使用标签
fortran90,没有通用标签fortran。fortran90仅用于针对这个有点旧的版本的具体问题。 -
弗拉基米尔,我将添加主程序。抱歉,我之前没有包括在内。
-
你公开声明中的单冒号是错字吗?
-
@Vladimir F:感谢您提供关于 (kind=4) 的提示。我使用从 f77 移植的大量遗留代码,其中有大量的 integer*4 和 (kind=4) (以及其他类型)。
标签: fortran gfortran intel-fortran