如何使用 Python 包装 c++ 库(.h 和 .lib 文件)?

How can I wrap a c++ library (.h & .lib files) using Python?

本文关键字:lib 文件 Python 何使用 包装 c++      更新时间:2023-10-16

我有一个c++库,只包含.h.lib文件(nocpp文件),用于与硬件通信,我需要使用Python中的这个库。我对c/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

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

Boost.Python还需要.cpp文件

不,没有。你可以用Boost.Python包装你的库。使用Boost.Pathon公开C++代码的方法是使用Boost.Python.提供的各种宏编写一个共享库

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。