【发布时间】:2019-07-05 20:38:25
【问题描述】:
class A{
A();
void a();
virtual void v();
}
把它做成 liba.so
class B : A {
B();
void b();
void v();
}
extern "C" {
A* newB() {
return new B();
}
void calla(A*b) {
b->a();
}
void callv(A*b) {
b->v();
}
}
把它做成 libb.so
在python中:
from ctypes import cdll
lib = cdll.LoadLibrary('./libb.so')
class B(object):
def __init__(self):
self.obj = lib.newb()
def a(self):
lib.calla(self.obj)
def v(self):
lib.callv(self.obj)
b = B()
b.a() # call base class function, that's ok
b.v() # call derive class virtual function , segment fault!
这是否意味着python不能使用包含继承逻辑的dll?
好像python不能调用c++类,因为它的函数入口改变了bc继承逻辑,有人能谈谈吗?
谢谢
【问题讨论】:
-
s.v()?s来自哪里?o.O -
这并不能回答你的问题(这也很模糊),但如果你需要包装一个 C++ 库,你可以看看 pybind11:pybind11.readthedocs.io/en/stable 而不是制作 C 版本您的库并使用 ctypes。
-
错字,就是@JoeyMallone
-
谢谢,我会试试 pybind11 @HannesOvrén
-
请注意,C++ ABI 因不同的编译器而异,有时甚至在相同的编译器系列中但版本不同。因此,您通常甚至不能在 MSVC 中使用使用 GCC 构建的 C++ 库。如果您尝试使用 pybind 或类似工具,您可能必须使用相同的编译器编译(pybind 和您的 dll)才能使其运行。
标签: python c++ dll virtual ctypes