Первоначально у меня была эта ошибка в более крупном проекте с 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 не зависит ни от какой lib python .so.
РЕДАКТИРОВАТЬ : _struct.*.so
, похоже, не имеет зависимостей от lib python, связанных в (это то же самое для моего стандартного интерпретатора 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)
Я также проверил _struct.*.so
моего системного python интерпретатора на другом компьютере, и он имеет:
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)