python - 在 Python 中导入 C++ 共享对象时出现段错误

标签 python c++ shared-objects

我有以下共享对象:
MyLib.cpp

#include <iostream>

class MyClass
{
 public:
 MyClass(){}

 void function()
 {
  std::cout << "hello" << std::endl;
  //var = 10;
 }

 private:

 int var;

};



extern "C" {
 MyClass* create()
 {
  return new MyClass();
 }


 void func(MyClass* myclass)
 {
  myclass->function();
 }

}
我编译的:g++ -fPIC -shared -o MyLib.so MyLib.cpp然后我将它与以下 Python 脚本一起使用:
脚本.py
import ctypes

lib = ctypes.cdll.LoadLibrary("./MyLib.so")

MyClass = lib.create()
lib.func(MyClass)
像这样,它工作得很好,但如果我取消注释该行 //var = 10; , Python 导致段错误 (Python 3.8)。每次对象 MyClass 时都会发生这种情况对其局部变量之一进行更改(构造函数内部除外)。看起来像变量var的地址是错误的,访问时出现段错误。我尝试将关键字“虚拟”用于 function没有任何更改,我尝试使用 dlfcn 在另一个 C++ 程序中导入共享对象,效果很好。知道出了什么问题吗?

最佳答案

指针不一样:

extern "C" {
    MyClass* create()
    {
        MyClass* myclass = new MyClass();
        std::cerr << "Returning: " << myclass << "\n";
        return myclass;
    }


    void func(MyClass* myclass)
    {
        std::cerr << "Calling:   " << myclass << "\n";
        myclass->function();
    }

}
运行我得到:
Returning: 0x7faab9c06580
Calling:   0xffffffffb9c06580
看起来某处存在标志扩展问题。
你需要告诉 python 被传递的对象的类型,否则它认为它们是 int和讨厌的事情发生:
import ctypes

lib = ctypes.cdll.LoadLibrary("./MyLib.so")
lib.create.restype = ctypes.c_void_p;
lib.func.argtypes = [ ctypes.c_void_p ];


MyClass = lib.create();
lib.func(MyClass)

关于python - 在 Python 中导入 C++ 共享对象时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66480311/

相关文章:

Python:同时多个HTTP请求

c++ - 具有多个指针的 Pimpl

linux - 为什么从非图片对象创建的共享库可以工作?

linux - rsync:/usr/lib/libpopt.so.0: 无可用版本信息(rsync 需要)

python - 更改像素透明背景

python - 如何为 Django 模型实例创建非数据库自动属性

c++ - 仅覆盖 C++ 映射迭代器取消引用

c++ - 如何在 C++ 中将文本颜色更改为任何颜色

actionscript-3 - Flash/AS3 "Shutdown"或 "close"事件?

python - 中止 gsutil 传输