用ctypes包装简单的c ++示例;分段故障

时间:2013-06-21 17:00:02

标签: c++ python ctypes

我通过添加私有成员变量扩展了此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 ++代码之后),我收到了一个分段错误,我已经缩小到mbar()的打印。

不会发生seg故障

  1. 在原始代码中
  2. 如果我删除m的打印但将其保留为变量
  3. 如果我将m替换为bar()中的任何固定数字。
  4. 我真的很困惑为什么会发生这种情况。由于这是一个学习ctypes的实验,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

如果您使用的是64位Python,则需要定义restypeargtypes。否则,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,结果至少是一致的。