Неопределенный символ boost python: boost::python::detail::init_module

#python #python-3.x #boost-python

#python #python-3.x #boost-python

Вопрос:

Я получаю ошибку undefined symbol при попытке импортировать расширение, скомпилированное с помощью boost python, и этот символ должен быть включен в библиотеку boost.

Я использую Boost 1.46.1, Python 3.1.2 и GCC 4.4.5.

Я создал boost, используя:

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

Затем я скомпилировал следующую тривиальную библиотеку Boost Python:

 #include <boost/python.hpp>

struct mystruct {
    int i;
};

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

используя команду:

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

который выполняется успешно без ошибок.

Затем я пытаюсь запустить его на python, но, похоже, он не может найти функцию init_module, которую должен предоставлять boost python:

 $ 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 сообщает следующее:

 $ 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)
  

Редактировать:

nm подтверждает, что /usr/local/lib/libboost_python3.so.1.46.1 действительно включает init_module, но ошибка сохраняется:

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

Ответ №1:

Неопределенный символ — это

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

не

 boost::python::detail::init_module(PyModuleDefamp;, void (*)())
  

вкл http://www.boost.org/doc/libs/1_46_1/boost/python/module_init.hpp Я вижу, что сигнатура метода изменилась на последнюю в Python 3.

Вы должны убедиться, что PY_VERSION_HEX установлено правильно при обработке заголовков boost python.

В моей системе я вижу, что это, например, определено в /usr/include/python3.1/patchlevel.h (но сначала мне пришлось установить пакет разработки python 3.1)

Комментарии:

1. Большое спасибо. Странно, что boost python 1.45.0, казалось, работал без пакета разработки python.

2. Но, похоже, это действительно PyModuleDef amp;, на отсутствие которого жалуется компоновщик. @vsekhar, значит, вы исправили это, просто установив python-dev?