The problem was caused by mixing objects that compiled with
libc++ and object that compiled with
In our case, the library
myMod.so (compiled with
boost-python that compiled with
boost-python-libstdc++ from now). When
boost-python-libstdc++, it will work fine. Otherwise – on computer that its
boost-python has compiled with
libc++ (or another c++ library), it will have a problem loading and running it.
In our case, it happens because that
libc++ developers intentionally changed the name of all of their symbols to prevent you (and save you) from mixing code from their library and code from a different one:
myMod.so need a function that take an argument from the type. In
libc++, this type’s name is
std::__1::pair. Therefore, this symbol was not found.
To understand why mixing two version of the same API is bad, consider this situation: There are two libraries:
Bar. They both have a function that takes a
std::string and uses it for something but they use a different c++ library. When a
std::string that has been created by
Foo will be passed to
Bar will think that this is an instance of its c++ library’s
std::string and then bad things can happen (they are a completely different objects).
Note: In some cases, there would be no problem with two or more different versions of the same API in a completely different parts of a program. There will be a problem if they will pass this API’s objects between them. However, checking that can be very hard, especially if they pass the API object only as a member of another object. Also, a library’s initialization function can do things that should not happen twice. Another version may do these things again.
How to solve that?
- You can always recompile your libraries and make them match each other.
- You can link
boost-pythonto your library as a static library. Then, it will work on almost every computer (even one that doesn’t has
boost-pythoninstalled). See more about that here.
myMod.so need another version of
boost-python, one that compiled with a specific c++ library. Therefore, It would not work with any another version.