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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了功能无法匹配GLDEBUGPROC,仅在MSVC上(使用相同的glew版本2.1.0,在linux上使用gcc / clang就可以了)相关的知识,希望对你有一定的参考价值。

我有以下函数,我已经定义了我使用的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。

答案

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

void GLAPIENTRY messageCallback(...)

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

以上是关于功能无法匹配GLDEBUGPROC,仅在MSVC上(使用相同的glew版本2.1.0,在linux上使用gcc / clang就可以了)的主要内容,如果未能解决你的问题,请参考以下文章

仅在SOAP客户端上修复-内容类型不匹配

如何仅在某些行上获得多个 Java 正则表达式匹配

MSVC 2008,调试过程,无法调试

std::ofstream 无法在 win7/64 和 msvc2013 上使用 std::ios::ate 打开大文件

“ContentType 匹配查询不存在” - 仅在 SQLite 上,而不是 MySQL

仅在某些设备上出现核心数据标量错误