Undefined boost python symbol: boost::python::detail::init_module

匿名 (未验证) 提交于 2019-12-03 02:31:01

问题:

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:

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)



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!