Ошибка Seg при использовании ctypes с Python и C ++

Я пытаюсь запустить и запустить с использованием ctypes для вызова библиотек C ++ из Python 2.7 на машине Linux. На данный момент я просто пример игрушек. Я прочитал и смог воспроизвести пример, приведенный в этом потоке: Вызов C / C ++ из python? , Обратите внимание, что функции класса C ++ не принимают никаких входов.

Я пытаюсь расширить этот пример следующим образом.

foo.cpp

#include <iostream> #include <string> using namespace std; class Foo { public: Foo(string name); void bar(void); private: string myName; }; Foo::Foo(string name) { std::cout << "Entered constructor in C++" << std::endl; myName = name; } void Foo::bar(void) { std::cout << "Hello, this is " << myName << std::endl; } extern "C" { Foo* Foo_new(string name) {return new Foo(name);} void Foo_bar(Foo* foo) {foo->bar();} } 

Код компилируется с использованием g++ -c -fPIC foo.cpp -o foo.o а затем g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

Затем я использую следующую оболочку,

fooWrapper.py

 from ctypes import cdll, c_char_p lib = cdll.LoadLibrary('./libfoo.so') class Foo(object): def __init__(self,name): self.name = name self.obj = lib.Foo_new(c_char_p(name)) def bar(self): lib.Foo_bar(self.obj) 

Поскольку я c_char_p строку конструктору, у меня c_char_p впечатление, что мне нужно использовать его с помощью c_char_p . Возможно, это неправильно.

Когда я выполняю код в Python 2.7, я получаю ошибку сегментации,

 Python 2.7.2 (default, Feb 27 2012, 18:28:19) [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import fooWrapper as f >>> foo = f.Foo('somename') Segmentation fault 

Поэтому я никогда не попадаю в конструкторскую функцию C ++. У меня такая же проблема, независимо от того, self.name = name ли я / self.name = name строку self.name = name в методе конструктора в коде Python.

Что я делаю не так? Благодарю.

One Solution collect form web for “Ошибка Seg при использовании ctypes с Python и C ++”

В extern "C" вы объявляете Foo_new для принятия аргумента std::string , однако для того, чтобы код вызывался из Python, вы должны сделать его настоящей функцией C, которая включает в себя получение строк указателями на символы. Тем более, что вы на самом деле говорите интерпретатору, чтобы преобразовать строку в указатель на символ (это то, что c_char_p вызов c_char_p ).

  • pthread с обратным вызовом на python VM
  • Как настроить python ctypes 'c_wchar_p' и 'c_char_p' restype?
  • SWIG Python привязки к собственному коду, не работающему с OpenCV 2.1
  • Подклассификация ctypes - Python
  • python ctypes pragma pack для выровненного байта
  • Установить атрибут «скрыть» на папки в ОС Windows?
  • Python MessageBox с иконками с использованием ctypes и windll
  • ReadProcessMemory с ctypes
  • c ++ dll, вызываемый из Python
  • Создание объекта python из адреса памяти (с использованием gi.repository)
  • Как создать строку python из структуры ctype?
  • Python - лучший язык программирования в мире.