Linux マシンで ctypes を使用して Python 2.7 から C++ ライブラリを呼び出すことを試みています。今のところ、おもちゃの例を試しているだけです。私はこのスレッドで与えられた例を読んで複製することができました: Calling C/C++ from 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
ます。多分これは間違っています。
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
Pythonコードのコンストラクターメソッドに行を含めるかどうかに関係なく、同じ問題があります。
私は何を間違っていますか?ありがとう。