Имам 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 за отговор № 1Boost.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.