【发布时间】:2020-03-10 14:33:46
【问题描述】:
最初我在使用 pybind11 嵌入 anaconda Python 解释器的较大项目中遇到此错误。 只需一个简单的最小示例,我就能将其归结并重现错误。
当我运行我的可执行文件(嵌入了 python)时,我得到了这个错误:
Traceback (most recent call last):
File "<string>", line 3, in <module>
File "/app/Python-3.8.2-build/lib/python3.8/struct.py", line 13, in <module>
from _struct import *
ImportError: /app/Python-3.8.2-build/lib/python3.8/lib-dynload/_struct.cpython-38-x86_64-linux-gnu.so: undefined symbol: PyByteArray_Type
起初,我从源代码构建 Python-3.8.2。然后我从以下 C 代码编译了一个可执行文件:
#include <Python.h>
int main(int argc, char *argv[])
{
Py_Initialize();
PyRun_SimpleString("import struct");
if (Py_FinalizeEx() < 0) {
exit(120);
}
return 0;
}
使用这个命令:
gcc -o execpy execpy.c \
-I/app/Python-3.8.2-build/include/python3.8 \
-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 \
-L/app/Python-3.8.2-build/lib -lcrypt -lpthread -ldl -lutil -lm \
/app/Python-3.8.2/libpython3.8.a
然后只需执行./execpy 就会从上面给出错误...有什么想法吗?
编辑:在这个例子中,我想静态链接libpython,就像python解释器不依赖任何libpython.so一样。
编辑:_struct.*.so 似乎与链接的 libpython 没有依赖关系(这与我的标准 anaconda python 解释器相同):
$ ldd /app/Python-3.8.2-build/lib/python3.8/lib-dynload/_struct.cpython-38-x86_64-linux-gnu.so
linux-vdso.so.1 => (0x00007fff32bf0000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f71a5634000)
libc.so.6 => /lib64/libc.so.6 (0x00007f71a5266000)
/lib64/ld-linux-x86-64.so.2 (0x00007f71a5a5c000)
我还在另一台机器上检查了我的系统 python 解释器的_struct.*.so,它有它:
linux-vdso.so.1 => (0x00007ffe2b3d9000)
libpython3.6m.so.1.0 => /lib64/libpython3.6m.so.1.0 (0x00007febe24fd000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007febe22e1000)
libc.so.6 => /lib64/libc.so.6 (0x00007febe1f13000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007febe1d0f000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007febe1b0c000)
libm.so.6 => /lib64/libm.so.6 (0x00007febe180a000)
/lib64/ld-linux-x86-64.so.2 (0x00007febe2c30000)
【问题讨论】:
-
ldd /app/Python-3.8.2-build/lib/python3.8/lib-dynload/_struct.cpython-38-x86_64-linux-gnu.so说什么?它可能会加载不同的 libpython3.8 吗? -
我在上面的问题中添加了 ldd 输出。
-
你能在 python 可执行文件上试试 ldd 吗?
标签: python c++ shared-libraries dynamic-linking