Quang Thinh Ha Quang Thinh Ha - 27 days ago 11
C++ Question

Unable to compile simple Boost MPI example

I was trying to use MPI with C++ Boost using the following code:

#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <iostream>
namespace mpi = boost::mpi;

int main()
{
mpi::environment env;
mpi::communicator world;
std::cout << "I am process " << world.rank() << "on " << world.size() << "." << std::endl;
return 0;
}


And I have boost mpi compiled and installed:

~ ls /usr/local/include/boost | grep mpi
mpi
mpi.hpp
~ ls /usr/local/lib | grep mpi
libboost_mpi.a
libboost_mpi.so
libboost_mpi.so.1.62.0

~ ls /usr/local/lib | grep serialization
libboost_serialization.a
libboost_serialization.so
libboost_serialization.so.1.62.0
libboost_wserialization.a
libboost_wserialization.so
libboost_wserialization.so.1.62.0


Compiling using

mpic++ -L/usr/local/lib -I/usr/local/include/boost/mpi -lboost_mpi-gcc-mt-1_35 -lboost_serialization MPIBoostBindingExample.cpp -o MPIBoostBindingExample


But still got errors saying:

/tmp/ccKVwnKR.o: In function `main':
MPIBoostBindingExample.cpp:(.text+0x27): undefined reference to `boost::mpi::environment::environment(bool)'
MPIBoostBindingExample.cpp:(.text+0x33): undefined reference to `boost::mpi::communicator::communicator()'
MPIBoostBindingExample.cpp:(.text+0x3f): undefined reference to `boost::mpi::communicator::size() const'
MPIBoostBindingExample.cpp:(.text+0x4d): undefined reference to `boost::mpi::communicator::rank() const'
MPIBoostBindingExample.cpp:(.text+0xb8): undefined reference to `boost::mpi::environment::~environment()'
MPIBoostBindingExample.cpp:(.text+0xeb): undefined reference to `boost::mpi::environment::~environment()'
collect2: error: ld returned 1 exit status


Any help?

Answer

Works for me (Ubuntu 16.04) if I just add -lboost_mpi.

Your code (modulo minor edits):

edd@max:/tmp$ cat boostmpi.cpp 
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <iostream>
namespace mpi = boost::mpi;

int main() {
  mpi::environment env;
  mpi::communicator world;
  std::cout << "I am process " << world.rank() 
            << " on " << world.size() << "." << std::endl;
  return 0;
}
edd@max:/tmp$ 

And we just compile with the aforementioned library (which mpic++ does not know about by default)

edd@max:/tmp$ mpic++ -o boostmpi boostmpi.cpp -lboost_mpi
edd@max:/tmp$ orterun ./boostmpi
I am process 2 on 4.
I am process 3 on 4.
I am process 0 on 4.
I am process 1 on 4.
edd@max:/tmp$ 

This is helped by the fact that Boost headers and other libraries have 'system' status, ie are accessible with additional -I or -L flags.