函数无法匹配 GLDEBUGPROC,仅在 MSVC 上(使用相同的 glew 版本 2.1.0,在 linux 和 gcc/clang 上没问题)
Function unable to match GLDEBUGPROC, only on MSVC (uses same glew version 2.1.0, on linux with gcc/clang it's fine)
我定义了以下与 glDebugCallback
一起使用的函数,它在 Linux 上与 GCC 和 Clang 完美配合。但是在 Windows 上,以下代码不想注册为 OpenGL 的调试回调:
inline void messageCallback(GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length, const GLchar* message,
const void* userParam) {
// ...
}
然后我用
设置了它
glDebugMessageCallback(messageCallback, nullptr);
查看glew headers的内容后,显示:
typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar* message,
const void* userParam);
但我收到一条错误消息
Error (active) E0167 argument of type "void (*)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)" is incompatible with parameter of type "GLDEBUGPROC"
我一直在试图弄清楚为什么它只在 MSVC 上失败...但我很困惑,因为它看起来像逐字匹配。它在 GCC/Clang 上编译的事实也有点令人困惑,我不确定我遗漏了什么或为什么会这样。
注意inline
关键字不影响结果,我不带关键字试过也是同样的问题。我只是把它放在那里因为我想复制并粘贴确切的东西。我还通过差异检查器查看我是否以任何方式输入了错误的参数,但它们是相同的。
这是在 Visual Studio 2017 年内,使用 C++17、glew 2.1.0、现代 Opengl 等。我的 OpenGL 版本也是 4.6。
您可能需要包含 GLAPIENTRY
限定符:
void GLAPIENTRY messageCallback(...)
这指定了一个调用约定,告诉编译器修改函数参数的传递方式。在某些平台上它没有区别,但我猜它可能在 Windows.
上有区别
我定义了以下与 glDebugCallback
一起使用的函数,它在 Linux 上与 GCC 和 Clang 完美配合。但是在 Windows 上,以下代码不想注册为 OpenGL 的调试回调:
inline void messageCallback(GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length, const GLchar* message,
const void* userParam) {
// ...
}
然后我用
设置了它glDebugMessageCallback(messageCallback, nullptr);
查看glew headers的内容后,显示:
typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar* message,
const void* userParam);
但我收到一条错误消息
Error (active) E0167 argument of type "void (*)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)" is incompatible with parameter of type "GLDEBUGPROC"
我一直在试图弄清楚为什么它只在 MSVC 上失败...但我很困惑,因为它看起来像逐字匹配。它在 GCC/Clang 上编译的事实也有点令人困惑,我不确定我遗漏了什么或为什么会这样。
注意inline
关键字不影响结果,我不带关键字试过也是同样的问题。我只是把它放在那里因为我想复制并粘贴确切的东西。我还通过差异检查器查看我是否以任何方式输入了错误的参数,但它们是相同的。
这是在 Visual Studio 2017 年内,使用 C++17、glew 2.1.0、现代 Opengl 等。我的 OpenGL 版本也是 4.6。
您可能需要包含 GLAPIENTRY
限定符:
void GLAPIENTRY messageCallback(...)
这指定了一个调用约定,告诉编译器修改函数参数的传递方式。在某些平台上它没有区别,但我猜它可能在 Windows.
上有区别