在这里使用别人的代码。它用gfortran编译得很好。然而,在Portland Group下,我得到一个错误:
pgf90 -DsysLinux -DcompPGF90 -I/home/cables/GITM/share/Library/src -c -r8 -fast ModUtilities.F90
PGF90-S-0084-Illegal use of symbol mpi_wtime - not public entity of module (ModUtilities.F90: 419)
0 inform, 0 warnings, 1 severes, 0 fatal for sleep令人不快的代码行如下所示:
use ModMpi, ONLY : MPI_wtime(显然,这里有很多MPI内容,但我不认为这是重点。)因此,我转到ModMpi的源代码,即ModMpi.f90,在那里我看不到对MPI_WTIME的引用,但我看到:
use ModMpiInterfaces最后,我转到ModMpiInterface的源代码,找到下面这行:
public:: mpi_wtime好的,通过编辑ModMpi.f90并将mpi_wtime声明为公共的,我能够从PGI获得一个编译器。但我仍然想知道:为什么gfortran (显然)假设mpi_wtime是公开的,而PGI必须被明确告知这一点?为什么PGI不假设原始的公共声明在整个“使用链”中都有效?
我假设其中一种行为更接近Fortran标准。那是哪一个呢?
发布于 2012-11-29 08:28:40
对于完全相同的FortranMPI源代码,(而不是某种MPI库)的编译器行为在这里应该是相同的。
实体是否是模块的公共实体取决于定义或访问(通过使用)该实体的每个模块。模块A可能声明"something“并指定它是公共的,模块B可能使用模块A,然后指定同样的"something”是私有的。使用模块A的任何代码将能够访问“某些东西”,而只使用模块B的任何代码将不能访问“某些东西”。
在模块中声明的事物的缺省可访问性是公共的,但该缺省值可以通过私有语句(没有任何后续标识符的语句)来更改。如果出现这样的私有语句,您将看到使用PGI编译器描述的行为。
隐式类型(例如,从源代码中没有隐式NONE)在这里也会造成混乱。
https://stackoverflow.com/questions/13610927
复制相似问题