☰
VSCode 搭建 OpenGL 环境:MinGW + CMake + GLFW + GLAD 完整指南
2026/10/1 22:33:14 网站建设 项目流程

简介:这份资源面向希望在轻量级编辑器中开展图形编程的开发者与图形学初学者,解决在VSCode中从零配置OpenGL开发环境的问题。压缩包共17个文件,约440KB,包含C++源码与头文件、GLFW与glad静态库、Makefile构建脚本、VSCode配置文件以及编译产物,覆盖窗口创建、扩展加载与编译链接等关键环节。已有354人学习下载,说明该配置方案具备一定参考价值。读者可借助其中的示例代码与配置指南,快速跑通基础渲染程序,并逐步理解着色器加载、用户输入与窗口事件处理等流程,为后续学习纹理映射、光照模型、阴影与帧缓冲等进阶主题打下环境基础,减少在编译参数与库路径配置上反复试错的成本。

1. 用 VSCode 搭建 OpenGL 环境:为什么你照着 LearnOpenGL 敲完第一课还是黑屏

很多人第一次接触 OpenGL,都是跟着 LearnOpenGL 的教程走。教程写得确实好,但到了环境搭建这一步,大部分人卡在同一个地方:教程默认你用 Visual Studio,而你手上只有 VSCode。于是你去搜「VSCode 搭建 OpenGL 环境」,搜出来的文章要么只讲怎么装插件,要么贴一堆 CMake 配置却不解释为什么,最后你编译过了,运行却是一个黑窗口,连三角形都画不出来。

这篇要解决的就是这件事:在 VSCode 里从零搭出一套能跑 LearnOpenGL 全部示例的 OpenGL 开发环境。核心工具链是 MinGW-w64 + CMake + GLFW + GLAD,编辑器用 VSCode,构建和调试都在 VSCode 内完成。适合两类人:一是刚学完 C++ 基础、想跟着 LearnOpenGL 往下走的初学者;二是之前用 VS 跑通过、现在想迁到 VSCode 的开发者。整套方案在 Windows 上验证,Linux 和 macOS 的思路一致,差异点我会单独标出来。

2. 工具链选型:为什么是 GLFW + GLAD + MinGW 这套组合

2.1 OpenGL 在 Windows 上到底缺什么

OpenGL 本身只是一个规范,不是一套可以直接调用的库。Windows 系统自带opengl32.dll,但它只暴露 OpenGL 1.1 的函数。LearnOpenGL 教程里用到的glGenBuffers、glCreateShader这些函数,版本都在 1.1 以上,系统库根本不提供。所以你需要一个加载器,在运行时把显卡驱动里的现代 OpenGL 函数地址取出来,这就是 GLAD 干的事。

窗口和输入这块,OpenGL 自己不管。你得有个东西帮你创建窗口、处理键盘鼠标事件、管理 OpenGL 上下文。GLFW 就是干这个的,轻量、跨平台、API 干净。老教程里常见的 GLUT 已经停止维护了,freeglut 虽然还在更新但用起来没 GLFW 顺手。所以选型结论很明确:GLFW 管窗口和上下文,GLAD 管函数加载,两个配合就能跑通 LearnOpenGL 的所有示例。

编译器为什么选 MinGW-w64 而不是 MSVC?因为 VSCode 配 MSVC 需要额外处理环境变量和调试器路径,而 MinGW-w64 装完就能用,gcc/g++/gdb 一条龙,CMake 也能直接识别。如果你已经装了 Visual Studio 并且不想再装 MinGW,用 MSVC 也行,后面我会说差异在哪。

2.2 三个组件的版本选择和下载方式

GLFW 去官网下载 Windows 预编译包,选 64 位版本。下载下来是一个压缩包,解压后你会看到include和lib两个目录,这就是后面 CMake 要引用的路径。注意不要下源码包,源码包需要你自己编译,多一步没必要。

GLAD 是一个在线生成服务。打开网页后,语言选 C/C++,API 选 OpenGL,版本选 3.3(LearnOpenGL 教程用的就是这个版本),Profile 选 Core,然后点 Generate。下载下来是一个 zip,解压后包含include和src两个目录。src里只有一个glad.c文件,这个文件必须加入编译,否则链接会报一堆 undefined reference。

MinGW-w64 推荐用 MSYS2 安装,或者直接下 WinLibs 的独立包。装完之后确认gcc --version、g++ --version、gdb --version都能正常输出。CMake 去官网下 Windows 安装包,安装时勾选「Add CMake to the system PATH」。

注意:GLFW 的预编译包分 32 位和 64 位,MinGW 也分 32 位和 64 位,两者必须匹配。混用会在链接阶段报架构不兼容的错误。

2.3 VSCode 需要装哪些插件

只装三个就够:C/C++(Microsoft 出品,提供 IntelliSense 和调试支持)、CMake Tools(CMake 官方插件,提供配置、构建、调试的图形化入口)、CodeLLDB 可选(如果你在 macOS 上用 lldb 调试)。其他什么 OpenGL 语法高亮、GLSL 着色器高亮,都是锦上添花,不影响编译运行。

装完 C/C++ 插件后,它会自动检测你系统里的编译器。如果检测不到 MinGW,按Ctrl+Shift+P输入C/C++: Select IntelliSense Configuration,手动指定 gcc 路径。这一步只影响代码提示,不影响实际编译,但配好了写代码会舒服很多。

3. 从零搭出第一个能跑的项目:目录结构和 CMake 配置

3.1 目录结构怎么摆

我一般会按下面的结构组织项目,这个结构的好处是第三方库和自己的代码分离,后面加新库不会乱:

LearnOpenGLForVSCode/ ├── CMakeLists.txt ├── src/ │ └── main.cpp ├── include/ │ ├── GLFW/ │ │ └── glfw3.h │ └── glad/ │ └── glad.h ├── lib/ │ └── libglfw3.a ├── glad.c └── shaders/ ├── vertex.glsl └── fragment.glsl

include/GLFW/放 GLFW 的头文件,include/glad/放 GLAD 的头文件,lib/放 GLFW 的静态库,glad.c放在根目录方便 CMake 直接引用。shaders/目录后面放着色器文件,现在可以先空着。

3.2 CMakeLists.txt 怎么写

这是整个环境搭建的核心文件,每一行都有存在的理由:

cmake_minimum_required(VERSION 3.20) project(LearnOpenGLForVSCode CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 头文件搜索路径 include_directories(${CMAKE_SOURCE_DIR}/include) # 链接库搜索路径 link_directories(${CMAKE_SOURCE_DIR}/lib) # 收集源文件:main.cpp 和 glad.c set(SOURCES src/main.cpp glad.c ) add_executable(${PROJECT_NAME} ${SOURCES}) # 链接 GLFW 和 Windows 系统库 target_link_libraries(${PROJECT_NAME} glfw3 opengl32 gdi32 )

include_directories让编译器能找到#include <glad/glad.h>和#include <GLFW/glfw3.h>。link_directories让链接器能找到libglfw3.a。SOURCES里必须包含glad.c,这是新手最容易漏的一步。target_link_libraries里opengl32和gdi32是 Windows 系统库,Linux 上换成GL和dl,macOS 上换成框架-framework OpenGL。

3.3 main.cpp 的最小验证代码

先写一个最小的程序,能弹出窗口、清屏成深绿色就算成功:

#include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } int main() { // 初始化 GLFW if (!glfwInit()) { std::cerr << "GLFW init failed" << std::endl; return -1; } // 配置 OpenGL 3.3 Core Profile glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 创建窗口 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); if (!window) { std::cerr << "Window creation failed" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 加载 OpenGL 函数指针 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cerr << "GLAD init failed" << std::endl; return -1; } // 打印 OpenGL 版本,确认加载成功 std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << std::endl; // 渲染循环 while (!glfwWindowShouldClose(window)) { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }

glfwWindowHint这三行必须写在glfwCreateWindow之前,否则不生效。gladLoadGLLoader必须在glfwMakeContextCurrent之后调用,因为 GLAD 需要通过当前上下文来获取函数地址。glGetString(GL_VERSION)打印出来的版本号如果和你设置的一致,说明整条链路通了。

3.4 在 VSCode 里配置构建和调试

按Ctrl+Shift+P输入CMake: Configure,选择 MinGW 的编译器套件。配置完成后,底部状态栏会出现 Build 按钮,点一下就能编译。如果编译报错,先看错误信息里有没有undefined reference to gladLoadGLLoader,有的话就是glad.c没加进SOURCES。

调试配置用 CMake Tools 自动生成的就行。按F5启动调试,如果弹出窗口并且终端打印出 OpenGL 版本号,环境就搭好了。如果窗口一闪而过,在main函数最后加std::cin.get()暂停一下,看终端有没有报错。

4. 避坑指南:五个让环境搭建翻车的典型问题

4.1 窗口创建成功但 glClear 没反应

现象:程序不崩溃,窗口也弹出来了,但窗口内容一直是白色或者花屏,glClearColor设置的深绿色完全看不到。

原因:GLAD 没有正确加载函数指针,glClear调用的是一个空指针或者旧版函数。这种情况通常是因为gladLoadGLLoader的返回值没有被检查,或者调用顺序错了。

解决:确认gladLoadGLLoader在glfwMakeContextCurrent之后调用,并且检查返回值。如果返回 0,说明加载失败,打印glfwGetError看看具体错误。另外确认 GLAD 生成时选的版本和glfwWindowHint里设置的一致,都是 3.3。

4.2 链接报错 undefined reference toglfwInit

现象:编译阶段没问题,链接阶段报一堆undefined reference,函数名都是 GLFW 开头的。

原因:libglfw3.a没有被链接进去,或者链接顺序不对。MinGW 的链接器对库的顺序敏感,依赖别人的库要放在后面。

解决:检查CMakeLists.txt里link_directories的路径是否指向了libglfw3.a所在的目录。如果路径没问题,把target_link_libraries里的glfw3移到opengl32前面。还有一个常见原因是下载的 GLFW 包架构不对,32 位的库配 64 位的编译器,链接器会直接忽略。

4.3 运行时提示缺少 libgcc_s_seh-1.dll

现象:在 VSCode 里按 F5 能跑,但双击 exe 文件或者换台电脑就报缺少 DLL。

原因:MinGW 编译出来的程序默认动态链接 GCC 运行时库,这些 DLL 在 MinGW 的 bin 目录里,不在系统 PATH 里。

解决:在 CMakeLists.txt 里加静态链接选项:

target_link_options(${PROJECT_NAME} PRIVATE -static-libgcc -static-libstdc++ -static )

加完之后重新编译,exe 文件会变大,但不再依赖 MinGW 的 DLL。注意-static会把所有库都静态链接,包括系统库,有时候会引发其他问题,可以先只加前两个试试。

4.4 VSCode 的 IntelliSense 报红但编译能过

现象:代码里#include <glad/glad.h>下面有红色波浪线,提示找不到文件,但 CMake 编译完全正常。

原因:C/C++ 插件的 IntelliSense 配置和 CMake 的配置是两套系统。CMake 配好了不代表 IntelliSense 知道头文件在哪。

解决:按Ctrl+Shift+P输入C/C++: Edit Configurations (UI),在「包含路径」里加上${workspaceFolder}/include。如果用的是 CMake Tools 插件,它通常会自动生成compile_commands.json,在 C/C++ 插件设置里把「配置提供程序」改成 CMake Tools 就能自动同步。

4.5 调试时断点打不上

现象:按 F5 启动调试,断点变成灰色空心圆,提示「未绑定断点」。

原因:调试器没有加载到正确的符号信息,或者 launch.json 里的 program 路径指向了旧的可执行文件。

解决:确认 CMake 构建类型是 Debug 而不是 Release。在 CMakeLists.txt 里加set(CMAKE_BUILD_TYPE Debug),或者在 VSCode 底部状态栏把构建变体切成 Debug。然后检查 launch.json 里的program路径是否和 CMake 输出的 exe 路径一致。MinGW 的调试器用 gdb,确认miDebuggerPath指向了正确的 gdb.exe。

5. 进阶技巧:用 CMake FetchContent 自动拉取依赖

手动下载 GLFW 和 GLAD 虽然直观,但换台电脑就要重新来一遍,而且版本管理全靠文件名,容易搞混。CMake 3.11 之后引入了FetchContent,可以在配置阶段自动从远程仓库拉取依赖并编译,整个过程不需要手动下载任何东西。

5.1 用 FetchContent 拉取 GLFW

把 CMakeLists.txt 改成下面这样:

cmake_minimum_required(VERSION 3.20) project(LearnOpenGLForVSCode CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) include(FetchContent) # 自动拉取 GLFW 源码并编译 FetchContent_Declare( glfw GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_TAG 3.3.9 ) set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(glfw) # GLAD 没有官方 CMake 支持,仍然手动引入 include_directories(${CMAKE_SOURCE_DIR}/include) set(SOURCES src/main.cpp glad.c ) add_executable(${PROJECT_NAME} ${SOURCES}) target_link_libraries(${PROJECT_NAME} glfw opengl32 gdi32 )

FetchContent_Declare里的GIT_TAG指定版本号,这里用 3.3.9,你可以换成任何 release 标签。GLFW_BUILD_DOCS这几个选项关掉文档、测试和示例的编译,能省不少时间。FetchContent_MakeAvailable会自动下载、配置、编译 GLFW,然后target_link_libraries里直接写glfw就行,不需要再指定路径。

5.2 GLAD 的替代方案:glad2 和 CMake 集成

GLAD 的在线生成方式有个问题:每次换 OpenGL 版本都要重新生成一遍,而且生成出来的glad.c文件要手动管理。GLAD 2 提供了 CMake 支持,可以直接在 CMakeLists.txt 里指定要加载的 API 和版本:

FetchContent_Declare( glad GIT_REPOSITORY https://github.com/Dav1dde/glad.git GIT_TAG v2.0.6 SOURCE_SUBDIR cmake ) FetchContent_MakeAvailable(glad) # 生成 GL 3.3 Core 的加载器 glad_add_library(glad_gl_core_33 REPRODUCIBLE API gl:core=3.3) target_link_libraries(${PROJECT_NAME} glfw glad_gl_core_33 opengl32 gdi32 )

glad_add_library的第一个参数是目标名,API gl:core=3.3指定加载 OpenGL Core Profile 3.3。这样就不需要手动下载 GLAD 了,glad.c也不用自己管理。注意SOURCE_SUBDIR cmake这行,GLAD 2 的 CMakeLists.txt 在cmake子目录里,不指定的话 FetchContent 找不到。

5.3 验证环境是否完整

改完 CMakeLists.txt 后,删掉build目录重新配置。如果一切正常,CMake 会在配置阶段自动下载 GLFW 和 GLAD 的源码,然后编译。第一次配置会慢一些,因为要下载和编译依赖,之后就有缓存了。

验证方法很简单:在main.cpp里加一行打印 GLFW 版本:

int major, minor, rev; glfwGetVersion(&major, &minor, &rev); std::cout << "GLFW Version: " << major << "." << minor << "." << rev << std::endl;

如果打印出来的版本号和你GIT_TAG里指定的一致,说明 FetchContent 工作正常。再打印glGetString(GL_VERSION)确认 OpenGL 上下文也创建成功了。

我自己的习惯是,新项目一律用 FetchContent,不再手动下载任何库。唯一要注意的是网络问题,如果github.com访问不稳定,配置阶段会卡住。这种情况可以配一个本地镜像,或者提前把源码下好放到FetchContent的SOURCE_DIR里。环境搭好之后,后面写代码的时间才真正花在 OpenGL 本身,而不是折腾构建系统。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询