/ / Как мога да обгръщам c ++ библиотека (.h & .lib файлове), използвайки Python? - питон, c ++

Как мога да обвивам библиотека C ++ (.h & .lib файлове) с помощта на Python? - 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. Той мога do c ++, но изисква .cpp файлове
  • Boost.Python също изисква .cpp файлове
  • cffi е само С
  • Ctypes е само С

И така, какъв би бил най-добрият подход?

Отговори:

1 за отговор № 1

Boost.Python също изисква .cpp файлове

Не не е. Можете да обгръщате библиотеката си с Boost.Python. Начинът, по който излагате C ++ кода с помощта на Boost.Python е да напишете споделена библиотека, използвайки различните макроси, предоставени от 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.