У меня есть пользовательская библиотека C ++. Это предварительно построено, и у меня есть общая библиотека и заголовки. Я пытаюсь написать оболочку Python для этого с помощью Cython. Я выполнил шаги, упомянутые здесь и в этом ответе . После сборки, когда я пытаюсь импортировать библиотеку, она выдает ошибку сегментации.
gdb --args python3 -c 'import PyMyLib'
...
...
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff37292a9 in GlobalError::PushToStack() () from /usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0
Мой файл pxd выглядит так
cdef extern from "client_my_class.h":
cdef cppclass myClass:
const char* getList()
В файле pyx я пытаюсь просто вызовите функцию getList()
.
# distutils: language = c++
from my_client cimport *
cdef class MyClass:
cdef myClass* thisptr
def __cinit__(self):
self.thisptr = NULL
def __dealloc__(self):
pass
def printList(self):
if self.thisptr == NULL:
print("-- empty -- | thisptr = " + str(<long>self.thisptr))
else:
# this is causing the crash on import
# when commented out import works without crashing
print(self.thisptr.getList())
В __cinit__
нет создания объектов, поскольку конструктор является закрытым, и только класс-друг может создать объект.
Я использую gcc version 7.4.0
и Python 3.6.9
.
Мой подход к переносу библиотеки может быть неправильным, пожалуйста, укажите мне больше статей / документов для правильного.