【发布时间】:2021-06-03 09:53:14
【问题描述】:
我有以下共享对象:
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 脚本一起使用:
script.py
import ctypes
lib = ctypes.cdll.LoadLibrary("./MyLib.so")
MyClass = lib.create()
lib.func(MyClass)
像这样,它可以完美运行,但是如果我取消注释 //var = 10; 行,Python 会出现分段错误(Python 3.8)。每次对象MyClass 对其局部变量之一进行更改时都会发生这种情况(构造函数内部除外,它在其中工作)。看起来变量var 的地址错误,访问时出现分段错误。我尝试在没有任何更改的情况下为function 使用关键字“virtual”,并尝试使用 dlfcn 在另一个 C++ 程序中导入共享对象,效果很好。知道有什么问题吗?
【问题讨论】:
-
除此之外没有回答您的问题:由于
create()和func()的用户并不真正了解或关心他们使用的对象的类型。接口可能应该返回void*作为这方面的指标。func()函数可以在调用方法之前将其转换回正确的类型。
标签: python c++ shared-objects