Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译混合GNU Fortran/C++;MPI共享库 我试图编译一个C++ MPI包装器到MPI FORTRAN库,但是我没有连接。 包装器是使用 mpic++ -c my_wrapper.cc -o my_wrapper.o_C++_Fortran_Shared Libraries_Mpi - Fatal编程技术网

编译混合GNU Fortran/C++;MPI共享库 我试图编译一个C++ MPI包装器到MPI FORTRAN库,但是我没有连接。 包装器是使用 mpic++ -c my_wrapper.cc -o my_wrapper.o

编译混合GNU Fortran/C++;MPI共享库 我试图编译一个C++ MPI包装器到MPI FORTRAN库,但是我没有连接。 包装器是使用 mpic++ -c my_wrapper.cc -o my_wrapper.o,c++,fortran,shared-libraries,mpi,C++,Fortran,Shared Libraries,Mpi,my_wrapper.cc的内容如下: #include "mpi.h" extern"C" { void fortran_func_(int * comm,bool *do_init); } void c_func(MPI_Comm my_comm ) { MPI_Fint fcomm; fcomm = MPI_Comm_c2f(my_comm); bool do_init = false; fortran_func_(&fcomm, &

my_wrapper.cc的内容如下:

#include "mpi.h"

extern"C" {
  void fortran_func_(int * comm,bool *do_init);
}

void c_func(MPI_Comm my_comm ) 
{
   MPI_Fint    fcomm;
   fcomm = MPI_Comm_c2f(my_comm);
   bool do_init = false;
   fortran_func_(&fcomm, &do_init);
}
该库是使用

  MPI_LINK_FLAGS = $(shell mpic++ --showme:link)
  mpif90 -shared my_wrapper.o $(FORTRAN-LIBS) $(MPI_LINK_FLAGS) -o my_libc++.a
以下是链接错误:

  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in my_wrapper.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in my_wrapper.o
  "vtable for __cxxabiv1::__class_type_info", referenced from:
      typeinfo for MPI::Info in my_wrapper.o
      typeinfo for MPI::Errhandler in my_wrapper.o
      typeinfo for MPI::Win in my_wrapper.o
      typeinfo for MPI::Comm_Null in my_wrapper.o
      typeinfo for MPI::Group in my_wrapper.o
      typeinfo for MPI::Request in my_wrapper.o
      typeinfo for MPI::Status in my_wrapper.o
      ...
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for __cxxabiv1::__si_class_type_info", referenced from:
      typeinfo for MPI::Intercomm in my_wrapper.o
      typeinfo for MPI::Graphcomm in my_wrapper.o
      typeinfo for MPI::Cartcomm in my_wrapper.o
      typeinfo for MPI::Intracomm in my_wrapper.o
      typeinfo for MPI::Comm in my_wrapper.o
      typeinfo for MPI::Grequest in my_wrapper.o
      typeinfo for MPI::Prequest in my_wrapper.o
      ...
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "operator delete[](void*)", referenced from:
      MPI::Datatype::Get_contents(int, int, int, int*, long*, MPI::Datatype*) const in my_wrapper.o
      MPI::Comm::Alltoallw(void const*, int const*, int const*, MPI::Datatype const*, void*, int const*, int const*, MPI::Datatype const*) const in my_wrapper.o
      MPI::Intracomm::Create_cart(int, int const*, bool const*, bool) const in my_wrapper.o
      MPI::Intracomm::Spawn_multiple(int, char const**, char const***, int const*, MPI::Info const*, int) in my_wrapper.o
      MPI::Intracomm::Spawn_multiple(int, char const**, char const***, int const*, MPI::Info const*, int, int*) in my_wrapper.o
      MPI::Cartcomm::Get_topo(int, int*, bool*, int*) const in my_wrapper.o
      MPI::Cartcomm::Sub(bool const*) const in my_wrapper.o
      ...
  "operator delete(void*)", referenced from:
      MPI::Datatype::~Datatype() in my_wrapper.o
      MPI::Datatype::~Datatype() in my_wrapper.o
      MPI::Status::~Status() in my_wrapper.o
      MPI::Status::~Status() in my_wrapper.o
      MPI::Request::~Request() in my_wrapper.o
      MPI::Request::~Request() in my_wrapper.o
      MPI::Request::~Request() in my_wrapper.o
      ...
  "operator new[](unsigned long)", referenced from:
      MPI::Datatype::Get_contents(int, int, int, int*, long*, MPI::Datatype*) const in my_wrapper.o
      MPI::Comm::Alltoallw(void const*, int const*, int const*, MPI::Datatype const*, void*, int const*, int const*, MPI::Datatype const*) const in my_wrapper.o
      MPI::Intracomm::Create_cart(int, int const*, bool const*, bool) const in my_wrapper.o
      MPI::Intracomm::convert_info_to_mpi_info(int, MPI::Info const*) in my_wrapper.o
      MPI::Cartcomm::Get_topo(int, int*, bool*, int*) const in my_wrapper.o
      MPI::Cartcomm::Sub(bool const*) const in my_wrapper.o
      MPI::Cartcomm::Map(int, int const*, bool const*) const in my_wrapper.o
      ...
  "operator new(unsigned long)", referenced from:
      MPI::Intracomm::Clone() const in my_wrapper.o
      MPI::Cartcomm::Clone() const in my_wrapper.o
      MPI::Graphcomm::Clone() const in my_wrapper.o
      MPI::Intercomm::Clone() const in my_wrapper.o
  "___cxa_pure_virtual", referenced from:
      vtable for MPI::Comm in my_wrapper.o
  "___gxx_personality_v0", referenced from:
      Dwarf Exception Unwind Info (__eh_frame) in my_wrapper.o
  ld: symbol(s) not found for architecture x86_64
  collect2: error: ld returned 1 exit status
我找不到任何例子如何做这些事情(Fortran/C++与MPI的混合),所以我在这里询问,希望它在某个时候对其他人有用

附言

如果我尝试使用mpic++编译它:

MPIF_LINK_FLAGS = $(shell mpif90 --showme:link)
mpic++ -shared my_wrapper.o $(FORTRAN-LIBS) $(MPIF_LINK_FLAGS) -o $@
我从$(FORTRAN-LIBS)中漏掉了很多符号,而当我链接到
mpif90
时,这些符号就不存在了。 所以我想我最好把那些丢失的库添加到Fortran链接器中

如果有必要,我会使用
openmpi:1.6

EDIT1: 通过将这些添加到mpif90链接所有编译:

-L/opt/local/lib/gcc47/ -lstdc++

确实,一些标准C++的东西缺少

< p>看起来你正在使用Fortran链接器链接。它对C++标准库一无所知,所以所有C++标准库(代码< STD::iOSKASBASE/COD>)的这些部分将是“未定义符号”。您需要更改链接命令,添加C++标准库。

因为你的复合物既不是完全FORTRAN也不是完全C++,FORTRAN和C++连接都不是完全合适的。您可能需要考虑直接使用<代码> LD 。在这种情况下,您必须列出C++标准库和FORTRAN标准库作为链接的库。