Мое приложение должно вызывать функции CPython, поэтому мне нужно создать версию Python с общей библиотекой, а затем связать ее.
Я использую Python 3.7, вот команды для его создания:
CFLAGS="-O0 -g3" ./configure --prefix=${PY_INSTALL} --with-pydebug --enable-shared;
make;
make install
Вы можете видеть, что я добавил параметр «--enable-shared».
После вышеуказанных команд я вижу общую библиотеку:
$>ls dbg_install/lib/
libpython3.7dm.a* libpython3.7dm.so@ libpython3.7dm.so.1.0* pkgconfig/ python3.7/
Вот мой тестовый код:
$>cat foo.c
#include "Python.h"
int
make_TclObj_from_PyObj(PyObject *py_obj)
{
if (PyBytes_CheckExact(py_obj)) {
return 1;
} else {
assert(0 && "Do not support yet");
}
return 0;
}
Вот команда для его создания:
gcc -shared -o libfoo.so -I ./dbg_install/include/python3.7dm foo.c -L./dbg_install/lib -lpython3.7dm
Но я получаю следующую ошибку:
/usr/bin/ld: /tmp/cc7Oip8k.o: relocation R_X86_64_PC32 against symbol `PyBytes_Type' can not be used when making a shared object; recompile with -fPIC
Поиск в Google сообщает, что указанная выше ошибка связана с тем, что библиотека не построена с использованием разделяемой библиотеки.
Я даже экспериментировал с переименованием lib python3 .7dm.a в lib python3 .7dm.a.ori в чтобы убедиться, что это .so был связан. Но ошибка сохраняется.
Вы видите, что мне не хватает?