【发布时间】:2016-10-05 00:47:46
【问题描述】:
在我的应用程序中,我使用 boost_python 和 python 3.5.2。全部从 Ubuntu 14 中的源代码构建。
当我在 Ubuntu 中使用 --with-shared 选项从源代码构建 Python 3.5.2 时,我得到了 libpython3.so (7.6kB) 和 libpython3.5m.so (12MB)。我假设大的是真实的,而小的可能是转发调用到真实接口的东西。
由于 boost_python 可能假设客户端链接到 python (https://svn.boost.org/trac/boost/ticket/2615),我将 libpython3.so 链接到我的应用程序。但是当我运行它时,我得到了未解析的符号错误。
ldd -r myapp 或ldd -r libboost_python.so 都列出了所有未解析的python 符号,这些符号可以在nm -D libpython3.5m.so 中找到。
# ldd -r lib/libboost_python3.so
linux-vdso.so.1 => (0x00007ffe767fb000)
libstdc+.so.6 => /usr/lib/x86_64-linux-gnu/libstdc+.so.6 (0x00007f130a7a3000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f130a58d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f130a1c8000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1309ec2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f130acf4000)
undefined symbol: PyExc_ImportError (lib/libboost_python3.so)
undefined symbol: PyProperty_Type (lib/libboost_python3.so)
undefined symbol: PyExc_StopIteration (lib/libboost_python3.so)
undefined symbol: PyBool_Type (lib/libboost_python3.so)
undefined symbol: PyExc_ValueError (lib/libboost_python3.so)
undefined symbol: PyList_Type (lib/libboost_python3.so)
undefined symbol: _Py_NotImplementedStruct (lib/libboost_python3.so)
undefined symbol: PyExc_TypeError (lib/libboost_python3.so)
undefined symbol: PyDict_Type (lib/libboost_python3.so)
...
libpython3.so 依赖于 libpython3.5m.so 但它本身没有这些符号。
我认为基于此我应该将我的应用程序与libpython3.5m.so 链接,而不是与libpython3.so。但奇怪的是,如果我使用 LD_PRELOAD 加载 libpython3.so,那些符号在ldd -r libboost_python3.so
# LD_LIBRARY_PATH=lib LD_PRELOAD=lib/libpython3.so ldd -r lib/libboost_python3.so
linux-vdso.so.1 => (0x00007ffcb51f0000)
lib/libpython3.so (0x00007f6f728e3000)
libstdc+.so.6 => /usr/lib/x86_64-linux-gnu/libstdc+.so.6 (0x00007f6f725df000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6f723c9000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6f72004000)
libpython3.5m.so.1.0 => lib/libpython3.5m.so.1.0 (0x00007f6f71ae1000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6f718c3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6f715bd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6f72d32000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6f713b9000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f6f711b6000)
为什么要有libpython3.so 以及如何使用它?还是我应该只直接使用libpython3.5m.so?
【问题讨论】:
-
据我所知
3.5m是3.5与不同的内存管理器 - 你甚至应该有程序python3.5m。 Python 文档中有一些信息,但我不记得在哪里。 -
适用于 Ubuntu/Mint 的非官方 Python 存储库 - 你可以得到
Python 3.5.2forUbuntu 14.04- launchpad.net/~fkrull/+archive/ubuntu/deadsnakes -
谢谢@furas。 docs.python.org/3/extending/embedding.html 给出了链接flasg 的示例:-lpython3.4m,我想我现在应该使用
python3.5m.so而不是python3.so。 -
Difference between python3 and python3m executables - 似乎
m使用pymalloc而不是malloc
标签: python dynamic-linking boost-python