提问人:GEP75 提问时间:11/6/2017 最后编辑:Vladimir F Героям славаGEP75 更新时间:11/6/2017 访问量:879
使用 PGI Visual Fortran 编译 MPI 时无法解析的外部符号MPI_INIT
Unresolved external symbol MPI_INIT when compiling MPI with PGI Visual Fortran
问:
我正在使用 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”
这是什么原因,如何克服它?
答:
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_Init
pgi-visual-fortran
0赞
Steve Lionel
11/6/2017
我认为这样的选择是不好的做法。但我现在才意识到 OP 说他正在使用 PGI Visual Fortran - 我看过 Visual Fortran 并假设 Intel。(我仍然对 PGI 复制英特尔产品名称感到恼火。但是,我最初的回答仍然适用,假设 PGI 也复制了 DEC/Intel 指令的形式。
评论
include 'mpif.h'
pause
mpicc
mpifort
mpif.h
-lmpi
use mpi_f08
use mpi
include 'mpif.h'
include 'mpif.h'
man mpi_init