功能无法匹配GLDEBUGPROC,仅在MSVC上(使用相同的glew版本2.1.0,在linux上使用gcc / clang就可以了)

问题描述 投票:0回答:1

我有以下函数,我已经定义了我使用的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标头的内容后,它显示:

typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, 
                                       GLsizei length, const GLchar* message, 
                                       const void* userParam);

但是我收到一条错误信息

错误(活动)E0167类型“void(*)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar * message,const void * userParam)”的参数与“GLDEBUGPROC”类型的参数不兼容

我一直试图弄清楚为什么它只能用MSVC失败...但是我很卡住,因为它看起来像是逐字逐句。它在GCC / Clang上编译的事实也有点令人困惑,我不确定我错过了什么或者为什么会这样。

请注意,inline关键字不会影响结果,我尝试了没有关键字,并且存在同样的问题。我只是把它放在那里因为我想要复制并粘贴确切的东西。我还通过diff检查器来查看我是否以任何方式错误地执行了参数,但它们是相同的。

这是在Visual Studio 2017中,使用C ++ 17,glew 2.1.0,现代Opengl等。我的OpenGL版本也是4.6。

c++ opengl glew
1个回答
1
投票

您可能需要包含GLAPIENTRY限定符:

void GLAPIENTRY messageCallback(...)

这指定了一个调用约定,它告诉编译器修改函数参数的传递方式。在某些平台上它没有任何区别,但我猜它可能在Windows上。

© www.soinside.com 2019 - 2024. All rights reserved.