2

C++ MPI ラッパーを MPI Fortran ライブラリにコンパイルしようとしていますが、リンクに失敗します。ラッパーは次を使用してコンパイルされます

mpic++ -c my_wrapper.cc -o my_wrapper.o 

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 の混合) を見つけることができなかったので、ある時点で他の誰かに役立つことを期待してここに質問します。

PS

でコンパイルしようとするとmpic++

MPIF_LINK_FLAGS = $(shell mpif90 --showme:link)
mpic++ -shared my_wrapper.o $(FORTRAN-LIBS) $(MPIF_LINK_FLAGS) -o $@

$(FORTRAN-LIBS) から多くのシンボルを見逃していmpif90ます。したがって、不足しているライブラリを Fortran リンカに追加したほうがよいと思います。

Open MPI: 1.6大事なら使います。

EDIT1 : それらをmpif90に追加して、すべてをリンクするとコンパイルされます:

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

実際、いくつかの標準 C++ が欠落していました

4

1 に答える 1

2

FORTRAN リンカーを使用してリンクしているようです。C++ 標準ライブラリについては何も知らないため、C++ 標準ライブラリ (のような部分std::ios_base) はすべて「未定義シンボル」になります。C++ 標準ライブラリを追加するには、リンク コマンドを変更する必要があります。

コンポジットは完全に FORTRAN でも完全に C++ でもないため、FORTRAN リンカーも C++ リンカーも完全に適切ではありません。ld直接使用することを検討してください。その場合、リンクするライブラリとして、C++ 標準ライブラリと FORTRAN 標準ライブラリをリストする必要があります。

于 2013-04-08T12:16:10.170 に答える