Внешняя C ++ библиотека Cython выдает SIGSEGV GlobalError :: PushToStack () при импорте - PullRequest
0 голосов
/ 04 марта 2020

У меня есть пользовательская библиотека 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.

Мой подход к переносу библиотеки может быть неправильным, пожалуйста, укажите мне больше статей / документов для правильного.

...