提问人:Grusen 提问时间:11/15/2023 最后编辑:genpfaultGrusen 更新时间:11/15/2023 访问量:38
使用 Visual Studio 2022 #defines 隐藏在 #ifndef GL_VERSION_X_X 后面的 GLAD
GLAD #defines hidden behind #ifndef GL_VERSION_X_X, using Visual Studio 2022
问:
我已经开始学习引擎开发,并决定在我的项目中使用 GLAD 和 SDL2。我遵循了各种教程,并成功地将 SDL2 和 GLAD 链接到我的项目。但是我遇到了一个非常奇怪的问题。
我尝试使用该函数,但Visual Studio告诉我。于是我进入了glad.h,在里面搜索并找到了它。(我也无法使用任何其他功能。glGenBuffers()
glGenBuffers is undefined
glGenBuffers
#ifndef GL_VERSION_1_5
所以我试图注释掉那部分的 and,现在它奏效了!我可以用.而且因为我知道我有 opengl 的 4.6 版,所以我不必担心版本。#ifndef
#endif
glGenBuffers
这里的问题是,这感觉我没有按照预期去做,这可能会在未来带来问题。所以我所做的就是把和放回原处。但是现在 glad.h 绝对充斥着这些类型的多个错误:#ifndef
#endif
this declaration has no storage class or type specifier
the #if for this directive is missing
the #endif for this directive is missing
该文档与我拿到它时完全相同,但更奇怪的是,现在其他所有功能都可以正常工作。即使那些不在 but 例如.#ifndef GL_VERSION_1_5
#ifndef GL_VERSION_3_0
main.cpp 中的代码仍然编译并运行良好。当我折叠它时,它现在也显示“活动预处理器块”,而其他人说“非活动预处理器块”。#ifndef GL_VERSION_1_5
我尝试用另一个副本替换文档,现在我又回到了它说的老问题。值得注意的是,它在运行时运行良好,因此 GLAD 本身不是问题。glGenBuffers is undefined
gladLoadGLLoader(( GLADloadproc )SDL_GL_GetProcAddress)
有谁知道是什么原因导致了这个问题,以及我应该如何解决这个问题?
我目前正在使用的包括:
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
#include <glad/glad.h>
编译日志:
Build started...
1>------ Build started: Project: GrubEngineC++, Configuration: Debug x64 ------
1>GrubEngineC++.cpp
1>C:\Users\Arbeit\Desktop\C++ Engine\GEC\GrubEngineC++\include\glad\glad.h(873,1): warning C4005: 'GL_INVALID_INDEX': macro redefinition
1>C:\Users\Arbeit\Desktop\C++ Engine\GEC\SDL2\include\SDL_opengl_glext.h(1651): message : see previous definition of 'GL_INVALID_INDEX'
1>C:\Users\Arbeit\Desktop\C++ Engine\GEC\GrubEngineC++\include\glad\glad.h(915,1): warning C4005: 'GL_TIMEOUT_IGNORED': macro redefinition
1>C:\Users\Arbeit\Desktop\C++ Engine\GEC\SDL2\include\SDL_opengl_glext.h(1726): message : see previous definition of 'GL_TIMEOUT_IGNORED'
1>C:\Users\Arbeit\Desktop\C++ Engine\GEC\GrubEngineC++\GrubEngineC++.cpp(15,5): error C3861: 'glGenBuffers': identifier not found
1>Done building project "GrubEngineC++.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
答:
问题在于 OpenGL 定义的包含顺序。从编译日志中可以看出,当包含 glad 时,还有其他定义。GL_INVALID_INDEX
是 SDL 的 OpenGL 标头,并且已经包含许多与 OpenGL 相关的符号的定义,并且与 的使用相冲突。你要么必须把它包含在后面,要么不包含全部(这更好,除非你需要 .SDL_opengl.h
glad.h
glad.h
SDL_opengl.h
评论
#ifndef GL_VERSION_1_5
是一个标头保护,可以防止您在 glad.h 包含在多个位置时遇到麻烦。除非您在代码中定义,否则将存在块的内容。你确定你确实遇到了编译错误(而不仅仅是 IntelliSense 错误)吗?如果是这样,请从输出窗口添加编译日志和确切的错误消息。GL_VERSION_1_5
#ifndef
GL_INVALID_INDEX
SDL_opengl.h
SDL_opengl.h