У мене є бібліотека 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 для відповіді № 1Boost.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 також буде варіантом. Або типи.