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

2024-04-25 19:37:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我扩展了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包装未更改,为:

^{pr2}$

当我运行Python代码(在已经编译了C++代码之后),我得到了一个分割错误,我已经在^ {< CD1>}中缩小到^ {< CD3>}的打印。在

seg故障没有发生

  1. 在原始代码中
  2. 如果我删除m的打印,但将其保留为变量
  3. 如果我用m中的任何一个固定数来代替m。在

我真的很困惑为什么会发生这种事。由于这是一个学习ctypes的实验,任何帮助都将不胜感激。在


Tags: 函数代码answer示例newfooincludebar
1条回答
网友
1楼 · 发布于 2024-04-25 19:37:25

如果使用64位Python,则需要定义restype和{}。否则,ctypes默认将值转换为32位Cint。在

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/\u ctypes/callproc.c:

对于64位Windows,Clong是32位的,但在大多数其他64位平台上是64位的。通过强制int得到的结果至少是一致的。在

相关问题 更多 >