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

时间:2014-04-15 08:20:10

标签: python c++

我的c ++库只包含.h.lib个文件(没有 cpp文件),用于与硬件进行通信,我需要使用来自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

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

1 个答案:

答案 0 :(得分:1)

  

Boost.Python还需要.cpp文件

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

包装此C ++类型的documentation for Boost.Python demonstrates

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。