使用 freeglut 在 Windows 10 上出现 glDebugMessageCallback 问题

Posted

技术标签:

【中文标题】使用 freeglut 在 Windows 10 上出现 glDebugMessageCallback 问题【英文标题】:issue with glDebugMessageCallback on Windows 10 using freeglut 【发布时间】:2019-10-28 01:34:12 【问题描述】:

我想使用 `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 中的红色波浪线上,我收到以下消息:“argument of type void()(GLenum souce, GLenum type, GLenum id, GLenum severity, GLsizei length, const GLchar msg, GLvoid* user) 与 GLDEBUGPROC 类型的参数不兼容”。现在搜索头文件,我发现glcorearb.h的第2709行声明了GLDEBUGPROC,它被声明为:

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

这看起来与我正在使用的 DbgCallback 函数相同。我错过了什么?我需要做什么才能让它在 Windos 10 上运行

【问题讨论】:

【参考方案1】:

函数声明的APIENTRY 部分不是可选的。您的函数未提供此说明符,这可能会强制编译器对该函数使用 C 风格的调用约定,而该回调的调用者会期望这种约定。编译器试图让您避免以后出现更难调试的错误。

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

【讨论】:

APIENTRY 由编译错误得到,遗憾的是链接错误“LNK2001:未解析的外部符号_gl3wDebugMessageCallback”导致...猜猜是时候看看我有什么版本的gl3w 以及是否需要要被更新。另外,我只有一个回调定义,我很好奇错误消息中的“重载函数”部分......没有意义,因为我没有重载任何东西。

以上是关于使用 freeglut 在 Windows 10 上出现 glDebugMessageCallback 问题的主要内容,如果未能解决你的问题,请参考以下文章

windows上编译freeglut库

编译freeglut-3.0.0的Windows版静态库,及其使用示例

编译freeglut-3.0.0的Windows版静态库,及其使用示例

使用 MinGW、freeglut 和 glew 编译简单的静态 OpenGL 4.0 程序

如何使用 FREEGLUT 获得多显示器支持的所有分辨率?

OpenGL:Windows+Clion+MinGW+freeglut配置教程