簡體   English   中英

VRPN C ++代碼可在Linux上編譯,但不能在Windows上編譯

[英]VRPN C++ code compiles on Linux but not Windows

我在Linux上構建了一個VRPN客戶端。 它基於此: 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上的編譯方式有所不同,這就是為什么編譯器現在的代碼有問題。 但是我對要做的事很迷茫。

嘗試像這樣聲明您的回調:

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

對於linux, VRPN_CALLBACK定義為空,因此您沒有注意到那里的任何問題。 對於Windows,VRPN庫開發人員決定他們希望遵循__stdcall調用約定的回調。 因此,您必須相應地聲明函數,而最VRPN_CALLBACK ,最VRPN_CALLBACK方法是使用它們提供的相同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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM