[在Windows 10上使用freeglut发出glDebugMessageCallback的问题

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

我想使用`glDebugMessageCallback'函数来调试我的openGL程序。我已经将调试回调实现为:

void MyDbgCallback(GLenum source, GLenum type, GLenum id, GLenum severity, GLsizei length, const GLchar* msg, GLvoid* user)
{
    fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), type, severity, msg);
}

如位于此处的示例所示:https://www.khronos.org/opengl/wiki/Debug_Output另外,在初始化过程中,我包括以下两行:

// Enable debugging output
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback(MyDbgCallback, 0);

现在正在编译(VS2015),我收到以下错误消息:

1>error C2664: 'void (GLDEBUGPROC,const void *)': cannot convert argument 1 from 'overloaded-function' to 'GLDEBUGPROC'
1> note: None of the functions with this name in scope match the target type

[通过搜索网络(包括此站点),我已经看到很多帖子,回调函数中的最后一个参数应该为const GLvoid* user,并且我都尝试了使用相同错误的两种方法。

在IDE中的红线上方移动,我得到以下消息:“ void()(GLenum souce,GLenum类型,GLenum id,GLenum严重性,GLsizei长度,const GLchar类型]的参数 msg,GLvoid *用户)与GLDEBUGPROC类型的参数不兼容。现在搜索头文件,我发现在GLDEBUGPROC的第2709行声明了glcorearb.h,并将其声明为:

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

看起来与我使用的DbgCallback函数相同。我想念什么?我需要怎么做才能在Windos 10上使用此功能

c++ windows opengl
1个回答
0
投票

函数声明的APIENTRY部分不是可选的。您的函数未提供此说明符,这可能会迫使编译器对该函数使用C样式的调用约定,而该回调的调用程序将期望该约定。稍后,编译器将尝试使您免于难以调试的错误。

此外,您不应像这样重载回调。一个定义就足够了。

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