资讯详情

使用OpenMPI从Fortran调用C语言

我有一个编译问题,我已经减少到以下测试用例.我希望从fortran调用C例程,让C例程知道MPI.

请考虑以下示例代码,

Fortran主要:

! -- main.f90

program main

implicit none

external return_three

integer return_three

write(*,*) return_three()

end program main

C子程序:

// -- subs.cpp

#include

extern "C"

{

int return_three_();

}

int return_three_()

{

return 3;

}

请注意,为了重现问题,我只需要包括它mpi.h.

使用GCC 5.3和OpenMPI 1.10.编译(我也检查过)GCC 4.8和PGI 15.10)链接期间出现以下问题:

% mpic -c subs.cpp

% mpifort -c main.f90

% mpifort -o main subs.o main.o -lstdc -lgcc_s

subs.o: In function `MPI::Intracomm::Intracomm()':

subs.cpp:(.text._ZN3MPI9IntracommC2Ev[_ZN3MPI9IntracommC5Ev] 0x14): undefined reference to `MPI::Comm::Comm()'

subs.o: In function `MPI::Intracomm::Intracomm(ompi_communicator_t*)':

subs.cpp:(.text._ZN3MPI9IntracommC2EP19ompi_communicator_t[_ZN3MPI9IntracommC5EP19ompi_communicator_t] 0x19): undefined reference to `MPI::Comm::Comm()'

subs.o: In function `MPI::Op::Init(void (*)(void const*, void*, int, MPI::Datatype const&), bool)':

subs.cpp:(.text._ZN3MPI2Op4InitEPFvPKvPviRKNS_8DatatypeEEb[_ZN3MPI2Op4InitEPFvPKvPviRKNS_8DatatypeEEb] 0x24): undefined reference to `ompi_mpi_cxx_op_intercept'

subs.o:(.rodata._ZTVN3MPI3WinE[_ZTVN3MPI3WinE] 0x48): undefined reference to `MPI::Win::Free()'

subs.o:(.rodata._ZTVN3MPI8DatatypeE[_ZTVN3MPI8DatatypeE] 0x78): undefined reference to `MPI::Datatype::Free()'

collect2: error: ld returned 1 exit status

在我看来,像mpifort缺少C相关库.据我所知,mpifort应用于编译fortran主程序.针对OpenMPI 1.10.1编译的Intel 16.这个问题不会出现.

我的问题是:

>这里发生了什么?为什么英特尔能够处理这个示例代码而PGI / GCC不能处理?

>有没有可移植的方法?Fortran代码中包含带MPIC子程序?

>(如果可能的话)有没有解决我目前问题的简单方法?我试着在我的机器上编译一个包,所以如果我能添加它-lmagicfix或者别的东西最好.

解决方法:

添加到最后一步-lmpi_cxx,我能够使用GCC 5.3.0和openMPI 1.10.2编译代码:

% mpic -c subs.cpp

% mpifort -c main.f90

% mpifort -o main main.o subs.o -lstdc -lmpi_cxx

原因是openMPI包装编译器mpifort和mpic链接不同MPI库.您可以使用-showme:libs检查选项:

% mpifort -showme:libs

mpi_usempif08 mpi_usempi_ignore_tkr mpi_mpifh mpi

% mpic -showme:libs

mpi_cxx mpi

所以,为了使用C MPI你必须清楚地告诉库mpifort链接到它.

标签:openmpi,c,gcc,fortran

来源: https://codeday.me/bug/20190824/1706239.html

标签: 直线位移传感器lmpi

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台