【问题标题】:Undefined boost python symbol: boost::python::detail::init_module未定义的 boost python 符号: boost::python::detail::init_module
【发布时间】:2011-04-27 20:24:20
【问题描述】:

尝试导入使用 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", &mystruct::i)
        ;
}

使用命令:

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

成功且没有错误。

然后我尝试在 python 中运行它,但似乎找不到 boost python 应该提供的 init_module 函数:

$ 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(PyModuleDef&, void (*)())

【问题讨论】:

    标签: python python-3.x boost-python


    【解决方案1】:

    未定义的符号是

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

    不是

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

    http://www.boost.org/doc/libs/1_46_1/boost/python/module_init.hpp我看到方法签名在Python 3中已经变成了后者。

    您应该确保在处理 boost python 标头时正确设置了PY_VERSION_HEX

    在我的系统上,我看到这是例如在/usr/include/python3.1/patchlevel.h 中定义(但我必须先安装python 3.1 development 包)

    【讨论】:

    • 非常感谢。奇怪的是 boost python 1.45.0 似乎在没有 python dev 包的情况下也能工作。
    • 但它似乎确实是链接器抱怨没有的 PyModuleDef& 一个。 @vsekhar,所以你通过安装 python-dev 解决了这个问题?
    猜你喜欢
    • 2014-12-07
    • 2017-07-05
    • 2012-12-25
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2019-08-17
    相关资源
    最近更新 更多