我通过添加私有成员变量扩展了此answer中提供的示例,并将其打印在bar()
函数中:
#include <iostream>
class Foo{
private:
double m;
public:
Foo() { m = 2.344; };
void bar(){
std::cout << "Hello, number is " << m << std::endl;
}
};
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}
ctypes
包装器未更改,并且是:
from ctypes import *
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self):
lib.Foo_bar(self.obj)
f = Foo()
f.bar()
当我运行python代码时(之前已经编译过C ++代码之后),我收到了一个分段错误,我已经缩小到m
中bar()
的打印。
不会发生seg故障
m
的打印但将其保留为变量m
替换为bar()
中的任何固定数字。 我真的很困惑为什么会发生这种情况。由于这是一个学习ctypes的实验,任何帮助将不胜感激。
答案 0 :(得分:3)
如果您使用的是64位Python,则需要定义restype
和argtypes
。否则,ctypes默认将值转换为32位C int
。
from ctypes import *
lib = CDLL('./libfoo.so')
lib.Foo_new.argtypes = []
lib.Foo_new.restype = c_void_p
lib.Foo_bar.argtypes = [c_void_p]
lib.Foo_bar.restype = None
以下是2.7.5,Modules / _ctypes / callproc.c的源链接:
对于64位Windows,C long
是32位,但在大多数其他64位平台上它是64位。通过强制int
,结果至少是一致的。