Hi to everyone in the list.

First of all, thanks in advance for your help and your time, that I'm pretty sure is
very valuable.

I will try to describe the problem I'm getting while using boost graph's library.

I've been developping an algorithm that makes use of the boost graph library. During
the development, I coded everything in a cpp file and made some testing. In this phase
all my code was compiled and linked within an executable file and everything worked
fine.

Imagine that my code was the following one (this code actually does nothing but
it is enough to explain the problems I'm experiencing):

void f1 (void) {

   Graph g (100);

   for (unsigned i = 1; i < 100; i++)
      boost::add_edge (i - 1, i, g);

   boost::graph_traits<Graph>::edge_iterator it, it_end;
   for (boost::tie (it, it_end) = boost::edges (g); (it != it_end); it++);

}

int main (void) {

   f1 ();
   return 0;

}

This example program compiled, linked and executed fine.

Once my code was ready, I decided to integrate this code into the library it should go.
This library is a dynamic library that is loaded by another program with dlopen, and some
symbols are read from it and used. So, imagine the following scenario (again, very simplified,
but enough to explain the problem):

main.cc:

int main (void) {

   char* libpath = "mylib.so";
   void* handle;
   handle = dlopen (libpath, RTLD_NOW | RTLD_GLOBAL);

   // Some symbols are read with dlsym

   return 0;

}

mylib.cc:

extern "C" bool someFunction (int* data) {

   // do some things
   return true;

}

void f1 (void) {

   Graph g (100);

   for (unsigned i = 1; i < 100; i++)
      boost::add_edge (i - 1, i, g);

   boost::graph_traits<Graph>::edge_iterator it, it_end;
   for (boost::tie (it, it_end) = boost::edges (g); (it != it_end); it++);

}

Both the main program and the library compile fine, but when I try to execute
the program I get undefined symbols errors:

/home/me/lib/mylib.so: undefined symbol: _ZneIN5boost6detail20undirected_edge_iterISt14_List_iteratorINS0_9list_edgeIjNS0_11no_propertyEEEENS1_14edge_desc_implINS0_14undirected_tagEjEEiEEEiRKT_SE_

If I demangle the symbol I get:

c++filt _ZneIN5boost6detail20undirected_edge_iterISt14_List_iteratorINS0_9list_edgeIjNS0_11no_propertyEEEENS1_14edge_desc_implINS0_14undirected_tagEjEEiEEEiRKT_SE_

int operator!=<boost::detail::undirected_edge_iter<std::_List_iterator<boost::list_edge<unsigned int, boost::no_property> >, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned int>, int> >(boost::detail::undirected_edge_iter<std::_List_iterator<boost::list_edge<unsigned int, boost::no_property> >, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned int>, int> const&, boost::detail::undirected_edge_iter<std::_List_iterator<boost::list_edge<unsigned int, boost::no_property> >, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned int>, int> const&)

The problem is, I think, that the operator!= is not compiled within the dynamic library for some reason.

Any hints or ideas to solve the problem?

Thanks again for your time.