使用 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 问题的主要内容,如果未能解决你的问题,请参考以下文章
编译freeglut-3.0.0的Windows版静态库,及其使用示例
编译freeglut-3.0.0的Windows版静态库,及其使用示例