/ / Як я можу обернути бібліотеку c ++ (файли .h & .lib) за допомогою Python? - пітон, с ++

Як я можу загорнути бібліотеку c + + (файли .h і .lib) за допомогою Python? - python, c ++

У мене є бібліотека c ++, яка містить тільки .h і .lib файли (немає cpp файли) для спілкування з обладнанням, і мені потрібно використовувати цю бібліотеку з Python. Я не маю багато досвіду роботи з c / ++, тому мені це все чуже.

The .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 );

Озирнувшись, ось що я знайшов:

  • Цитон в першу чергу для C. It може робити c ++, але вимагає .cpp файли
  • Boost.Python також вимагає .cpp файли
  • cffi - це лише C
  • ctypes - це лише C

Отже, який би був найкращий підхід?

Відповіді:

1 для відповіді № 1

Boost.Python також вимагає .cpp файлів

Ні, це не є. Ви можете обгорнути свою бібліотеку за допомогою Boost.Python. Спосіб викриття коду C ++ за допомогою Boost.Python - це написання спільної бібліотеки за допомогою різних макросів, наданих Boost.Python.

The документація на 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 також буде варіантом. Або типи.