使用 PGI Visual Fortran 编译 MPI 时无法解析的外部符号MPI_INIT

Unresolved external symbol MPI_INIT when compiling MPI with PGI Visual Fortran

提问人:GEP75 提问时间:11/6/2017 最后编辑:Vladimir F Героям славаGEP75 更新时间:11/6/2017 访问量:879

问:

我正在使用 Visual Fortran,并且我正在尝试使用 MPI 实现一个非常简单的代码。

program hello_world
include 'C:\Program Files (x86)\Microsoft SDKs\MPI\Include\mpif.h'
integer ierr
call MPI_INIT ( ierr )
write(*,*) 'Hello world'
call MPI_FINALIZE ( ierr )
pause
end program hello_world

在我定义了库并完成了我在许多博客中发现的许多步骤之后,我遇到了这个错误:

“错误 1 错误 LNK2019:函数 MAIN__ hello_world.obj 中引用了未解析的外部符号MPI_INIT”

这是什么原因,如何克服它?

Fortran MPI 链接器 错误未解决-外部 PGI-视觉-Fortran

评论

1赞 Pierre de Buyl 11/6/2017
两条注释:(i) 应该足够(不是完整路径) (ii) 自 Fortran 95 起已弃用。现在,请解释一下您是如何构建代码的?请明确说明,否则任何人都无能为力。include 'mpif.h'pause
0赞 Steve Lionel 11/6/2017
如果未将 Microsoft MPI 包含的路径添加到编译器包含路径中,则可能需要完整路径。
1赞 Gilles Gouaillardet 11/6/2017
这表明编译器是直接调用的,因此 MPI 库未链接到二进制文件。构建 MPI 应用程序的推荐方法是使用 MPI 包装器(和朋友)。这将包括通往或链接的路径或所需的任何内容。最后但并非最不重要的一点是,您可能需要考虑或至少代替遗留问题。mpiccmpifortmpif.h-lmpiuse mpi_f08use mpiinclude 'mpif.h'
0赞 Vladimir F Героям слава 11/6/2017
你应该告诉我们你到底在做什么。那些*“很多步骤”是什么?你是如何编译的?您正在执行哪个命令或单击什么?您使用的是哪个软件(版本)?@GillesGouaillardet 问题在于,即使在版本 2 中,OpenMPI 手册也明确地教人们这样做。基本上在野外使用的所有版本中。因此,当人们在谷歌上搜索时,会得到一个显示 mpif.h 的官方 OpenMPI 示例。include 'mpif.h'man mpi_init
0赞 Gilles Gouaillardet 11/6/2017
是的,自 Open MPI v3 以来,这是“固定”的。我会看看我是否可以修复 v2 系列。

答:

1赞 Steve Lionel 11/6/2017 #1

根本问题是库中的入口点是MPI_Init,但由于 Fortran 不区分大小写,而且 Windows 上的 PGI Fortran 似乎将所有名称都大写,MPI_INIT与MPI_Init不匹配。(我假设您正在为 x64 构建并链接到 x64 库。

我注意到 MS MPI 包含一个声明模块 MPI 的 MPI.f90 文件。但这也没有解决案例问题。

如果您使用的是英特尔(非 PGI)Visual Fortran,则可以在 INCLUDE 之后添加以下行:

!DEC$ ATTRIBUTES DECORATE, ALIAS:"MPI_Init" :: MPI_INIT
!DEC$ ATTRIBUTES DECORATE, ALIAS:"MPI_Finalize" :: MPI_FINALIZE

看看这是否有效。PGI可能有类似的东西。显然,您需要添加其他指令来重命名您调用的其他 MPI 例程。

评论

0赞 Gilles Gouaillardet 11/6/2017
MPI 库通常带有 C 和(几种风格的)Fortran 绑定。因此,假设 MPI 库是使用相同的编译器构建的,它应该按原样工作。
0赞 Steve Lionel 11/6/2017
我在 MS MPI 库中转储了导入,它不包含大写符号。有三个 x64 库:msmpi.lib 是 DLL 导入库,msmpifec.lib 和 msmpifmc.lib 是静态库。后两者只有小写符号(带有尾部下划线),这是 gfortran 会使用的,但英特尔 Fortran 不会。 x86 具有带有 STDCALL 接口的附加库。没有可直接与英特尔 Fortran 配合使用的 MS 库。
1赞 Gilles Gouaillardet 11/6/2017
有没有选项可以生成带有尾部下划线的所有小写符号(a la gfortran)?如果不是,则在使用编译指示时调用哪个外部符号?它应该是而不是.顺便说一句,OP 已经设置了标签,所以我不确定他是否在使用英特尔编译器......mpi_init_MPI_Initpgi-visual-fortran
0赞 Steve Lionel 11/6/2017
我认为这样的选择是不好的做法。但我现在才意识到 OP 说他正在使用 PGI Visual Fortran - 我看过 Visual Fortran 并假设 Intel。(我仍然对 PGI 复制英特尔产品名称感到恼火。但是,我最初的回答仍然适用,假设 PGI 也复制了 DEC/Intel 指令的形式。