如何将命名空间中的 C++ class 包含到 Cython 中?
How do I include a C++ class in a namespace into Cython?
我正在尝试为一组 C++ classes 创建包装,以便我可以使用 Cython 在 Python 中使用它。到目前为止,这是我尝试过的。
cdef extern from "HilClass.h" namespace "acro":
cdef cppclass _HilClass "HilClass":
void start()
cdef class HilClass:
cdef _HilClass *ptr
cpdef start(self):
self.ptr.start()
无法编译。我收到以下错误,现在我了解到可能的原因是它没有找到 class。因此,在检查我是否正确包含 headers 和来源之后,我查看了 Cython 生成的 .cpp。我搜索了 acro
但没找到。代码中的任何地方都没有提到它。
error C2143: syntax error: missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
... (more warning and errors related to HilClass)
这是我决定将第二行更改为的时候。
cdef cppclass _HilClass "acro::HilClass":
这确实编译。但在我发现的任何 example/tutorial 中都没有这样做。所以我的问题是,我遗漏了一些东西,我的 'workaround' 能否继续可靠地工作。
注意:我对从 Python 或 Cython 中创建此 class 的实例不感兴趣,我只需要它环绕一个 HilClass 指针。
编辑:
这是 'HilClass.h' 里面的代码。 'acrophobe.h' 有一些 class 前向声明、枚举、typedef unint#_t ####
,并包括 stdint。
#include "acrophobe.h"
namespace acro {
class HilClass
{
public:
HilClass(AcrophobeClass *acro_ptr);
~HilClass();
HILSocketClass *sck;
void start();
void acrophile_iteration(char dest, lbp::PortID_t PortID);
void set_activity_iteration_start(bool s);
// More of these set_activity functions
void set_activity_logging(bool s);
private:
AcrophobeClass *acro;
};
}
你需要像你做的那样定义
cdef cppclass _HilClass "acro::HilClass"
因为您给 acro::HilClass 一个别名 _HilClass。你可以测试如果你定义
会发生什么
cdef cppclass HilClass:
void start()
然后稍后(class 名称仅供示例)
cdef class PyHilClass:
cdef HilClass * ptr
我看不出您的解决方案不可靠的任何原因。
我正在尝试为一组 C++ classes 创建包装,以便我可以使用 Cython 在 Python 中使用它。到目前为止,这是我尝试过的。
cdef extern from "HilClass.h" namespace "acro":
cdef cppclass _HilClass "HilClass":
void start()
cdef class HilClass:
cdef _HilClass *ptr
cpdef start(self):
self.ptr.start()
无法编译。我收到以下错误,现在我了解到可能的原因是它没有找到 class。因此,在检查我是否正确包含 headers 和来源之后,我查看了 Cython 生成的 .cpp。我搜索了 acro
但没找到。代码中的任何地方都没有提到它。
error C2143: syntax error: missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
... (more warning and errors related to HilClass)
这是我决定将第二行更改为的时候。
cdef cppclass _HilClass "acro::HilClass":
这确实编译。但在我发现的任何 example/tutorial 中都没有这样做。所以我的问题是,我遗漏了一些东西,我的 'workaround' 能否继续可靠地工作。
注意:我对从 Python 或 Cython 中创建此 class 的实例不感兴趣,我只需要它环绕一个 HilClass 指针。
编辑:
这是 'HilClass.h' 里面的代码。 'acrophobe.h' 有一些 class 前向声明、枚举、typedef unint#_t ####
,并包括 stdint。
#include "acrophobe.h"
namespace acro {
class HilClass
{
public:
HilClass(AcrophobeClass *acro_ptr);
~HilClass();
HILSocketClass *sck;
void start();
void acrophile_iteration(char dest, lbp::PortID_t PortID);
void set_activity_iteration_start(bool s);
// More of these set_activity functions
void set_activity_logging(bool s);
private:
AcrophobeClass *acro;
};
}
你需要像你做的那样定义
cdef cppclass _HilClass "acro::HilClass"
因为您给 acro::HilClass 一个别名 _HilClass。你可以测试如果你定义
会发生什么cdef cppclass HilClass:
void start()
然后稍后(class 名称仅供示例)
cdef class PyHilClass:
cdef HilClass * ptr
我看不出您的解决方案不可靠的任何原因。