4

I get an undefined symbol error when trying to import an extension compiled with boost python, and the symbol is one that should be included in the boost library.

I am using Boost 1.46.1, Python 3.1.2, and GCC 4.4.5.

I've built boost using:

$ ./bootstrap.sh --with-python-version=3.1
$ sudo ./bjam -j4 install

I then compiled the following trivial Boost Python library:

#include <boost/python.hpp>

struct mystruct {
    int i;
};

BOOST_PYTHON_MODULE(test) {
    using namespace boost::python;
    class_<mystruct>("Mystruct")
        .def_readwrite("i", &mystruct::i)
        ;
}

using the command:

$ g++ -shared question.cpp -I/usr/include/python3.1 -lboost_python3 -lpython3.1 -otest.so

which succeeds without error.

I then try to run it in python, but it can't seem to find the init_module function boost python is supposed to provide:

$ python3
Python 3.1.2 (release31-maint, Sep 17 2010, 20:34:23) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./test.so: undefined symbol: _ZN5boost6python6detail11init_moduleEPKcPFvvE

ldd reports the following:

$ ldd -r test.so
    linux-gate.so.1 =>  (0x00ab3000)
    libboost_python3.so.1.46.1 => /usr/local/lib/libboost_python3.so.1.46.1 (0x002fe000)
    libpython3.1.so.1.0 => /usr/lib/libpython3.1.so.1.0 (0x005dc000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x001f8000)
    libm.so.6 => /lib/libm.so.6 (0x00110000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00424000)
    libc.so.6 => /lib/libc.so.6 (0x00886000)
    libutil.so.1 => /lib/libutil.so.1 (0x00e13000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00136000)
    libdl.so.2 => /lib/libdl.so.2 (0x00349000)
    librt.so.1 => /lib/librt.so.1 (0x00150000)
    libssl.so.0.9.8 => /lib/libssl.so.0.9.8 (0x00553000)
    libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x00ab4000)
    libffi.so.5 => /usr/lib/libffi.so.5 (0x00159000)
    libz.so.1 => /lib/libz.so.1 (0x00160000)
    libexpat.so.1 => /lib/libexpat.so.1 (0x00175000)
    /lib/ld-linux.so.2 (0x00495000)
undefined symbol: _ZN5boost6python6detail11init_moduleEPKcPFvvE (./test.so)

EDIT:

nm confirms that /usr/local/lib/libboost_python3.so.1.46.1 does indeed include init_module, yet the error persists:

$ nm /usr/local/lib/libboost_python3.so.1.46.1 | c++filt | grep init_module
00031a00 T boost::python::detail::init_module(PyModuleDef&, void (*)())

1 Answer 1

6

The undefined symbol is

boost::python::detail::init_module(char const*, void (*)())

not

boost::python::detail::init_module(PyModuleDef&, void (*)())

on http://www.boost.org/doc/libs/1_46_1/boost/python/module_init.hpp I see that the method signature has changed to the latter one in Python 3.

You should make sure that PY_VERSION_HEX is set correctly when the boost python headers are processed.

On my system, I see that this is e.g. defined in /usr/include/python3.1/patchlevel.h (but I had to install the python 3.1 development package first)

Sign up to request clarification or add additional context in comments.

2 Comments

Great thanks. Strange that boost python 1.45.0 seemed to work without the python dev package.
But it really does seem to be the PyModuleDef& one that the linker is complaining about not having. @vsekhar, so you fixed this by just installing python-dev?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.