vse*_*har 4 python boost-python python-3.x
尝试导入使用 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
Run Code Online (Sandbox Code Playgroud)
然后我编译了以下简单的 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)
;
}
Run Code Online (Sandbox Code Playgroud)
使用命令:
$ g++ -shared question.cpp -I/usr/include/python3.1 -lboost_python3 -lpython3.1 -otest.so
Run Code Online (Sandbox Code Playgroud)
成功而没有错误。
然后我尝试在 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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
编辑:
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 (*)())
Run Code Online (Sandbox Code Playgroud)
未定义的符号是
boost::python::detail::init_module(char const*, void (*)())
Run Code Online (Sandbox Code Playgroud)
不是
boost::python::detail::init_module(PyModuleDef&, void (*)())
Run Code Online (Sandbox Code Playgroud)
在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开发包)
| 归档时间: |
|
| 查看次数: |
6620 次 |
| 最近记录: |