GLAD必须在glfwMakeContextCurrent(window)之后调用,且GLFW版本需与GLAD生成版本严格一致;Windows下不应链接opengl32.lib;Core Profile禁用固定管线函数。

GLAD 必须在 GLFW 创建上下文之后调用 gladLoadGLLoader
很多人卡在黑屏或 glClearColor 崩溃,根本原因是调用顺序错了。GLAD 不是“加载头文件”那么简单,它要从当前 OpenGL 上下文中提取函数地址——而这个上下文由 GLFW 创建并激活。如果你在 glfwInit() 之后、glfwCreateWindow() 之前就调用 gladLoadGLLoader,或者更糟,在 glfwMakeContextCurrent(window) 之前调用,gladLoadGLLoader 就会返回 false,后续所有 OpenGL 函数调用都是空指针。
正确顺序只能是:
glfwInit()-
glfwWindowHint(指定版本和 profile) glfwCreateWindow()-
glfwMakeContextCurrent(window)(关键!必须在这之后) gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)
漏掉 glfwMakeContextCurrent 或把它放在 GLAD 后面,是 Windows 和 macOS 上最常复现的崩溃原因。
GLFW 的 GLFW_CONTEXT_VERSION_MINOR 必须匹配 GLAD 生成时选的版本
比如你在 GLAD 在线生成器里选了 OpenGL 4.6 Core,但代码里写的是:
立即学习“C++免费学习笔记(深入)”;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
那 glfwCreateWindow 很可能返回 nullptr,尤其在 Intel 集成显卡或旧驱动上。不是“不支持 4.6”,而是驱动只按你声明的版本提供上下文——GLAD 加载时发现函数表里没有 4.6 的入口,就会拒绝初始化。
安全做法是:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 先查显卡实际支持的最高版本:
glxinfo | grep "OpenGL core profile version"(Linux)、system_profiler SPDisplaysDataType(macOS)、或用 GPU-Z(Windows) - GLAD 生成时选的版本 ≤ 实际支持版本
-
glfwWindowHint的主次版本必须和 GLAD 生成时完全一致
常见误区:以为“选高一点更未来proof”,结果连窗口都开不出来。
链接 opengl32.lib 是 Windows 特有的冗余操作
在 Windows 上,很多教程让你在链接器里加 opengl32.lib,这其实是误导。现代 OpenGL(3.2+ Core Profile)的函数地址全部由 GLAD 运行时从驱动中获取,opengl32.lib 提供的只是兼容层里的 OpenGL 1.1 函数(如 glBegin),这些在 Core Profile 下已被废弃,链接它不仅没用,还可能掩盖符号未定义错误。
你应该只链接:
-
glfw3.lib(或静态编译的glfw3_mt.lib) - 确保
glad.c被加入项目编译(不是仅放头文件) - 绝对不要链接
opengl32.lib,除非你明确要用 Compatibility Profile + 固定管线
Linux/macOS 完全不需要这一步——libGL.so 或 OpenGL framework 由系统自动解析,GLAD 直接通过 dlsym 或 NSLookupSymbolInImage 拿地址。
GLAD 生成时 Profile 选 Core 就别碰 glEnable(GL_DEPTH_TEST) 之前的固定管线遗留调用
Core Profile 下,glEnableClientState、glVertexPointer、glMatrixMode 这类函数已彻底移除。但有人照着老教程抄代码,把 glEnable(GL_DEPTH_TEST) 和 glEnable(GL_CULL_FACE) 放在一堆废弃调用后面,结果 glGetError() 返回 GL_INVALID_ENUM 却被忽略,渲染静默失败。
检查点:
- 确认 GLAD 生成页勾选的是
Core(不是Compatibility) - 删掉所有以
glEnableClientState、glLoadIdentity、glTranslatef开头的代码 -
glEnable(GL_DEPTH_TEST)可以用,但它依赖你已创建并绑定的深度缓冲(即glfwWindowHint(GLFW_DEPTH_BITS, 24))
最容易被忽略的是:即使你没写任何顶点数据,只要调用了废弃函数,整个上下文就可能进入未定义状态,后续 glDrawArrays 会直接跳过——不是报错,是“什么也不做”。

















