gpt4 book ai didi

c++ - ctypes/C++ 段错误访问成员变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:34 24 4
gpt4 key购买 nike

我对 python ctypes 模块并不陌生,但这是我第一次尝试在一个代码中结合 C++、C 和 Python。我的问题似乎与 Seg fault when using ctypes with Python and C++ 非常相似,但是我似乎无法以同样的方式解决问题。

我有一个名为 Header.cpp 的简单 C++ 文件:

#include <iostream>

class Foo{
public:
int nbits;
Foo(int nb){nbits = nb;}
void bar(){ std::cout << nbits << std::endl; }
};

extern "C" {
Foo *Foo_new(int nbits){ return new Foo(nbits); }
void Foo_bar(Foo *foo){ foo->bar(); }
}

我使用以下方法将其编译为共享库:

g++ -c Header.cpp -fPIC -o Header.o
g++ -shared -fPIC -o libHeader.so Header.o

和一个名为 test.py 的简单 Python 包装器:

import ctypes as C
lib = C.CDLL('./libHeader.so')

class Foo(object):
def __init__(self,nbits):
self.nbits = C.c_int(nbits)
self.obj = lib.Foo_new(self.nbits)

def bar(self):
lib.Foo_bar(self.obj)

def main():
f = Foo(32)
f.bar()

if __name__ == "__main__":
main()

我希望当我调用 test.py 时,我应该将数字 32 打印到屏幕上。但是,我得到的只是一个段错误。如果我更改构造函数以返回堆栈上的类实例(即没有 new 调用)然后传递对象,程序将按预期执行。此外,如果我更改 Foo 类中的 bar 方法,使其不使用 nbits 成员,则程序不会出现段错误。

我对 C++ 的了解有限,但我可以在 C 和 C++ 中按预期实现此功能,但在 Python 中却不能,这让我有点困惑。任何帮助将不胜感激。

更新:感谢以下评论之一,问题已解决。在这种情况下,需要为 C 函数显式声明 restype 和 argtypes。即以下内容已添加到 python 代码中:

lib.Foo_new.restype  = C.c_void_p
lib.Foo_new.argtypes = [C.c_int32]
lib.Foo_bar.restype = None
lib.Foo_bar.argtypes = [C.c_void_p]

最佳答案

我会尝试以下方法:

extern "C"
{
Foo *Foo_new(int nbits)
{
Foo *foo = new Foo(nbits);
printf("Foo_new(%d) => foo=%p\n", nbits, foo);
return foo;
}
void Foo_bar(Foo *foo)
{
printf("Foo_bar => foo=%p\n", foo);
foo->bar();
}
}

查看 foo 的值是否匹配。

此外,您可能希望查看 Boost.Python 以简化创建 C++ 对象的 Python 绑定(bind)。

关于c++ - ctypes/C++ 段错误访问成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com