繁体   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