Код VRPN C ++ компилируется в Linux, но не в Windows

Я создал клиент VRPN на Linux. Это основано на этом: http://www.vrgeeks.org/vrpn/tutorial—use-vrpn

Вот часть кода:

vrpn_Analog_Remote * analog = NULL;
vrpn_Button_Remote * button = NULL;
vrpn_Tracker_Remote * tracker = NULL;

// Things happen...

analog = new vrpn_Analog_Remote("pathToAnalog");
analog->register_change_handler(NULL, handleAnalog);
button = new vrpn_Button_Remote("pathToButton");
button->register_change_handler(NULL, handleButton);
tracker = new vrpn_Tracker_Remote("pathToTracker");
tracker->register_change_handler(NULL, handleTracker);

Вот обратные вызовы, на которые ссылаются в этом коде:

void handleAnalog(void * userData, const vrpn_ANALOGCB a) {
// Do stuff...
}
void handleButton(void * userData, const vrpn_BUTTONCB b) {
// Do stuff...
}
void handleTracker(void * userData, const vrpn_TRACKERCB t) {
// Do stuff...
}

И вот где все эти ссылки на VRPN определены:

https://github.com/vrpn/vrpn/blob/master/vrpn_Analog.h#L168
https://github.com/vrpn/vrpn/blob/master/vrpn_Button.h#L225
https://github.com/vrpn/vrpn/blob/master/vrpn_Tracker.h#L284

Они компилируются без предупреждения даже в Linux и могут фактически использоваться. Все заработало как положено. Кажется, что все типы здесь удовлетворяют компилятору g ++.

Но в Windows, использую ли я Visual Studio 2015 или MinGW g ++, я получаю это для первых двух регистраций обратного вызова:

invalid conversion from 'void (*)(void*, vrpn_ANALOGCB) {aka void (*)(void*, _vrpn_ANALOGCB)}' to 'vrpn_ANALOGCHANGEHANDLER {aka
void (__attribute__((__stdcall__)) *)(void*, _vrpn_ANALOGCB)}' [-fpermissive]

invalid conversion from 'void (*)(void*, vrpn_BUTTONCB) {aka void (*)(void*, _vrpn_BUTTONCB)}' to 'vrpn_BUTTONCHANGEHANDLER {aka
void (__attribute__((__stdcall__)) *)(void*, _vrpn_BUTTONCB)}' [-fpermissive]

И в последнем случае я получаю другую ошибку:

call of overloaded 'register_change_handler(NULL, void (&)(void*, vrpn_TRACKERCB))' is
ambiguous

Теперь, когда я набираю это, я думаю, что, возможно, VRPN был скомпилирован по-другому в Windows, и поэтому у компилятора теперь есть проблема с моим кодом. Но я очень потерян, что делать.

0

Решение

Попробуйте объявить ваши обратные вызовы следующим образом:

void VRPN_CALLBACK handleAnalog(void * userData, const vrpn_ANALOGCB a) {
// Do stuff...
}

Для Linux VRPN_CALLBACK define пуста, так что вы не заметили там никаких проблем. Для окон разработчики библиотеки VRPN решили, что они ожидают обратного вызова, который придерживается __stdcall вызов-конвенция. Таким образом, вы должны объявить свою функцию соответственно, и самый безболезненный + переносимый способ — это использовать тот же самый VRPN_CALLBACK определить, что они предоставляют.

Подсказки к этому пришли из ваших ссылок на код на github:

[vrpn_Analog.h]
typedef void(VRPN_CALLBACK *vrpn_ANALOGCHANGEHANDLER)(void *userdata,
const vrpn_ANALOGCB info);

и определение обратного вызова производится здесь:

[vrpn_Configure.h]
#ifdef _WIN32   // [ ...
#define VRPN_CALLBACK __stdcall
#else // ... ] WIN32 [
#define VRPN_CALLBACK
#endif // ] not WIN32
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]