On 31 August 2010 18:39, Patrik Jonsson <c...@familjenjonsson.org> wrote: > Hi all, > > I'm have a C MPI code that I need to link into my C++ code. As usual, > from my C++ code, I do > > extern "C" { > #include "c-code.h" > } >
#include <mpi.h> extern "C" { #include "c-code.h" } Would that be enough? > where c-code.h includes, among other things, mpi.h. > > This doesn't work, because it appears mpi.h tries to detect whether > it's being compiled as C or C++ and includes mpicxx.h if the language > is C++. The problem is that that doesn't work in C linkage, so the > compilation dies with errors like: > > mpic++ -I. -I$HOME/include/libPJutil -I$HOME/code/arepo -m32 > arepotest.cc -I$HOME/include -I/sw/include -L/sw/lib > -L$HOME/code/arepo -larepo -lhdf5 -lgsl -lgmp -lmpi > In file included from /usr/include/c++/4.2.1/map:65, > from /sw/include/openmpi/ompi/mpi/cxx/mpicxx.h:36, > from /sw/include/mpi.h:1886, > from /Users/patrik/code/arepo/allvars.h:23, > from /Users/patrik/code/arepo/proto.h:2, > from arepo_grid.h:36, > from arepotest.cc:3: > /usr/include/c++/4.2.1/bits/stl_tree.h:134: error: template with C linkage > /usr/include/c++/4.2.1/bits/stl_tree.h:145: error: declaration of C > function 'const std::_Rb_tree_node_base* std::_Rb_tree_increment(const > std::_Rb_tree_node_base*)' conflicts with > /usr/include/c++/4.2.1/bits/stl_tree.h:142: error: previous > declaration 'std::_Rb_tree_node_base* > std::_Rb_tree_increment(std::_Rb_tree_node_base*)' here > /usr/include/c++/4.2.1/bits/stl_tree.h:151: error: declaration of C > function 'const std::_Rb_tree_node_base* std::_Rb_tree_decrement(const > std::_Rb_tree_node_base*)' conflicts with > /usr/include/c++/4.2.1/bits/stl_tree.h:148: error: previous > declaration 'std::_Rb_tree_node_base* > std::_Rb_tree_decrement(std::_Rb_tree_node_base*)' here > /usr/include/c++/4.2.1/bits/stl_tree.h:153: error: template with C linkage > /usr/include/c++/4.2.1/bits/stl_tree.h:223: error: template with C linkage > /usr/include/c++/4.2.1/bits/stl_tree.h:298: error: template with C linkage > /usr/include/c++/4.2.1/bits/stl_tree.h:304: error: template with C linkage > /usr/include/c++/4.2.1/bits/stl_tree.h:329: error: template with C linkage > etc. etc. > > It seems a bit presumptuous of mpi.h to just include mpicxx.h just > because __cplusplus is defined, since that makes it impossible to link > C MPI code from C++. > > I've had to resort to something like > > #ifdef __cplusplus > #undef __cplusplus > #include <mpi.h> > #define __cplusplus > #else > #include <mpi.h> > #endif > > in c-code.h, which seems to work but isn't exactly smooth. Is there > another way around this, or has linking C MPI code with C++ never come > up before? > > Thanks, > > /Patrik Jonsson > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users > -- Lisandro Dalcin --------------- CIMEC (INTEC/CONICET-UNL) Predio CONICET-Santa Fe Colectora RN 168 Km 472, Paraje El Pozo Tel: +54-342-4511594 (ext 1011) Tel/Fax: +54-342-4511169