Parallel processing Fortran C-编译BLAC时调用约定-下划线不匹配

Parallel processing Fortran C-编译BLAC时调用约定-下划线不匹配,parallel-processing,blas,Parallel Processing,Blas,我正在Linux上编译BLACS包。我编译了这个包,安装目录的内容。当我尝试构建目录测试的内容时,会出现错误 blacstest.f:(.text+0xb9): undefined reference to `blacs_gridinit_' 等等 当我试图在库中查找函数时,得到的信息是 ~/sources/BLACS/LIB$ nm blacs_MPI-LINUX-0.a | less | grep blacs_gridinit_ blacs_gridinit_.o: 00000000000

我正在Linux上编译BLACS包。我编译了这个包,安装目录的内容。当我尝试构建目录测试的内容时,会出现错误

blacstest.f:(.text+0xb9): undefined reference to `blacs_gridinit_'
等等

当我试图在库中查找函数时,得到的信息是

~/sources/BLACS/LIB$ nm blacs_MPI-LINUX-0.a | less | grep blacs_gridinit_
blacs_gridinit_.o:
0000000000000000 T blacs_gridinit__
Cblacs_gridinit_.oo:
因此函数存在,但带有双下划线。如何让它只有一个

我在Bmake.inc.尝试过一些东西

#   INTFACE = -Df77IsF2C
#   INTFACE = -fno-underscoring
    INTFACE = -DAdd_
但这一切似乎都不起作用。有人对此有经验吗

谢谢, 伊兰

编辑: BLACS附带一个.inc文件,其中配置了所有内容。我有:

   F77            = mpif77
   F77NO_OPTFLAGS = 
   F77FLAGS       = $(F77NO_OPTFLAGS) -O -fPIC 
   F77LOADER      = $(F77)
   F77LOADFLAGS   = 
   CC             = mpicc
   CCFLAGS        = -O4 -fPIC
   CCLOADER       = $(CC)
   CCLOADFLAGS    =
-假设两个编译标志中都不接受2下划线。此外,template.inc文件还显示:

#  ---------------------------------------------------------------------------
#  The Fortran 77 to C interface to be used.  If you are unsure of the correct
#  setting for your platform, compile and run BLACS/INSTALL/xintface.
#  Choices are: Add_, NoChange, UpCase, or f77IsF2C.
#  ---------------------------------------------------------------------------
#   INTFACE = -Df77IsF2C
EasyBuild(部分)为您解决了这个问题,有关实现BLACS构建过程的Python代码,请参阅

它还没有构建测试,但是它确实以正确的方式构建了blac

正如您在template.inc文件中所看到的,您应该构建xintface工具并运行它,这将帮助您确定INTFACE的正确设置。 您还需要确保TRANSCOMM设置正确,您可以使用xtc_CsameF77和xtc_UseMpich工具来实现这一点


计算完INTFACE和TRANSCOMM out的值后,重新生成BLACS并在make命令行上进行设置。然后再次尝试构建测试(使用相同的选项)。

是否尝试使用
-DNoChange
?您使用的是什么编译器和链接器?您是否尝试过诸如
-假设2下划线
?@HighPerformanceMark的标志,请参见编辑。@Elan:不,这不会告诉我们您使用的编译器和链接器
mpif77
mpicc
是编译器包装,通常作为MPI安装的一部分分发,并且通常以shell脚本的形式分发。按照编译器的建议运行
BLACS/INSTALL/xintface
怎么样。我从来没有安装过BLACS,所以我很难猜测这个程序会做什么,但它可能会探测Fortran是如何损坏外部符号名的。默认情况下,GCC的Fortran编译器(g77或gfortran)将外部符号设置为小写,并附加一个下划线,例如,
FUNC
变为
FUNC