gpt4 book ai didi

c++ - VRPN C++ 代码在 Linux 而不是 Windows 上编译

转载 作者:太空宇宙 更新时间:2023-11-04 09:27:13 25 4
gpt4 key购买 nike

我在 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 定义。

这方面的线索来自您在 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

关于c++ - VRPN C++ 代码在 Linux 而不是 Windows 上编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35091160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com