如何使用Python封装一个C++库(.h和.lib文件)?

3
我是一位有用的助手,可以翻译您需要的文本。
我有一个包含仅.h.lib文件(没有cpp文件)的C++库,用于与硬件通信,我需要从Python中使用此库。 我在c / ++方面没有太多经验,所以这一切都有些陌生。 .h文件看起来像这样:
#define MSG_DLL_VERSION 10

typedef struct {
   ULONG ulDLLVersion;
   // vipmsg variables
   PMSGACCOUNTS pMsgAccounts;
   PMSGSEGMENT  pMsgSegment;
   USHORT       usMsgSegmentNum;
} MSGSTATICDATA, *PMSGSTATICDATA;

VOID msgGetDLLRedirections ( PMSGSTATICDATA *pData ); 

VOID msgSetDLLRedirections ( PMSGSTATICDATA pData ); 

经过调查,以下是我找到的结果:

  • Cython 主要用于 C 语言。它可以处理 C++,但需要 .cpp 文件。
  • Boost.Python 也需要 .cpp 文件。
  • cffi 只支持 C 语言。
  • ctypes 只支持 C 语言。

那么,最好的方法是什么呢?


通常情况下,Python并不“理解”C++,正如你所发现的那样。你需要先用C包装器来封装你的C++函数。 - Mats Petersson
@MatsPetersson 有自动化的方法可以做到这一点吗? - Phillip B Oldham
我不知道有任何自动化的方法来做这件事。也许更好的选择是尝试找到一个可以完成相同功能的C库(或Python库?) - Mats Petersson
@MatsPetersson 很不幸,这不是一个选项;它是特定于我正在尝试通信的一种硬件。 - Phillip B Oldham
1个回答

1

Boost.Python同样需要.cpp文件。

不,它不需要。你可以使用Boost.Python包装你的库。使用Boost.Python暴露C++代码的方式是编写一个共享库,使用Boost.Python提供的各种宏。

Boost.Python文档演示了如何包装这个C++类型:

struct World
{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

包装器看起来像这样:

#include <boost/python.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
    ;
}

你可以使用自己的库来实现这个功能。你需要编写包装器。但是,被包装的类和方法是在.lib库文件中定义的,而不是.cpp源文件中定义的,这一点并不重要。

更新

从头文件中的示例代码来看,这更像是C风格的库而不是C ++。您可以使用Boost.Python,或者SWIG也是一个选项。或者使用ctypes。


谢谢David,我会再看一下文档。我已经添加了一小段来自.h文件的代码片段。它们大多看起来像那样,不太像你的例子。Boost.Python仍然是最好的选择吗? - Phillip B Oldham
对我来说看起来像是一个普通的 C 接口。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接