恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Ubuntu 20.04 下 OpenGL 开发环境搭建与 CLion 配置实战

  • 首页
  • 资讯中心
  • /
  • Ubuntu 20.04 下 OpenGL 开发环境搭建与 CLion 配置实战

相关资讯

字符串算法刷题三大基本功:双指针、步长循环与ACM模式扩容填充 2026/10/21 16:49:08
技能构建方法论:从工具层到判断层的可复用框架 2026/10/21 16:49:08
51单片机智能加湿器毕设实战:从原理图到闭环控制 2026/10/21 16:49:08

最新资讯

RK安卓驱动开发入门:设备树、内核分层与调试实战
深入理解MFC框架:从BasicDemo看Windows C++桌面开发核心机制
WPF界面切换动效实战:可配置、可回溯、可调试的导航方案
从FreeRTOS到Zephyr:嵌入式RTOS选型与实操指南
零拷贝协议解析实战:告别无脑memcpy,榨干总线吞吐量
大模型推理三层动态分流中枢:语义感知+资源锚定+结果熔断

今日推荐

SAP 屏幕上的金额未必存在数据库表里,从 WB2R_SV 的 Net Amount 看懂运行时计算
具身智能中‘指哪打哪’的视觉语言动作联合建模
AI时代人工翻译技术博客的价值与实践指南

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Ubuntu 20.04 下 OpenGL 开发环境搭建与 CLion 配置实战

发布时间:2026/10/21 16:49:08
Ubuntu 20.04 下 OpenGL 开发环境搭建与 CLion 配置实战 1. 为什么要在 Ubuntu 20.04 上折腾 OpenGL 开发环境如果你是一个做图形学、游戏引擎、CAD 工具或者可视化方向的开发者大概率绕不开 OpenGL 这套图形 API。虽然现在 Vulkan、Metal、DirectX 12 这些新一代 API 在性能上更激进但 OpenGL 依然是教学、原型验证、跨平台小工具开发里最稳的选择——驱动成熟、资料多、上手快而且几乎所有的集成显卡和独立显卡都对它有一等一的兼容支持。问题在于Ubuntu 20.04 这个 LTS 版本虽然稳定但它的默认软件源里带的 OpenGL 开发库版本偏旧而且和 CLion 这种 JetBrains 系的 IDE 配合时CMake 的查找路径、链接顺序、运行时动态库加载这几个环节特别容易出幺蛾子。我见过太多人卡在undefined reference to glfwInit或者GLFW window creation failed这种报错上一卡就是大半天。这篇内容就是把我自己在 Ubuntu 20.04 上反复配置 OpenGL 开发环境的经验整理出来从系统依赖安装、显卡驱动确认、CMake 工程配置到 CLion 里的调试技巧全部走一遍。目标读者是那些已经会写 C/C、但对 Linux 图形开发环境不太熟的人或者之前一直在 Windows 上用 Visual Studio 写 OpenGL、现在想迁移到 Linux 的开发者。整套流程我会给出可直接复制的命令和 CMakeLists 配置你照着做基本能一次跑通。2. 环境准备驱动、依赖库与工具链2.1 先确认显卡驱动和 OpenGL 运行时状态在装任何开发库之前第一件事是确认你的显卡驱动已经正常工作并且系统能报告出 OpenGL 版本。很多人跳过这一步结果后面编译通过了但运行时报GLX not available回头查驱动问题反而更费时间。Ubuntu 20.04 桌面版默认会安装开源驱动Intel 和 AMD 走 MesaNVIDIA 走 nouveau 或者官方驱动。你可以用下面这条命令快速查看当前 OpenGL 渲染器和版本glxinfo | grep -E OpenGL vendor|OpenGL renderer|OpenGL version如果提示glxinfo: command not found先装mesa-utilssudo apt update sudo apt install -y mesa-utils正常输出应该类似这样OpenGL vendor string: Intel Open Source Technology Center OpenGL renderer string: Mesa DRI Intel(R) UHD Graphics 620 OpenGL version string: 4.6 (Compatibility Profile) Mesa 21.2.6这里有几个关键点要注意。第一OpenGL version至少要 3.3 以上因为现代 OpenGL 教程和框架基本都以 3.3 Core Profile 为起点。第二如果你是 NVIDIA 独显用户vendor应该显示 NVIDIA Corporation如果显示 nouveau 或者 llvmpipe说明你在用软件渲染或者开源驱动性能会差很多建议去“软件和更新”里切换成官方专有驱动。提示如果你是在虚拟机里做开发比如 VMware 或 VirtualBox默认的 3D 加速可能只支持到 OpenGL 2.1 或 3.0。这种情况下建议开启虚拟机的 3D 加速选项或者干脆在物理机上做图形开发否则后面写 shader 会各种受限。2.2 安装 OpenGL 开发所需的库和头文件Ubuntu 20.04 上做 OpenGL 开发核心依赖分三块GL 本身、窗口和输入管理、扩展加载。下面这套组合是我用得最顺手的sudo apt install -y build-essential cmake git sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev sudo apt install -y libglfw3-dev libglew-dev sudo apt install -y libglm-dev逐个解释一下这些包的作用。libgl1-mesa-dev提供 OpenGL 的核心头文件GL/gl.h、GL/glx.h和链接库libglu1-mesa-dev是 GLU 工具库虽然现代开发用得少但有些老教程会依赖它libglfw3-dev是 GLFW 窗口库负责创建窗口、处理键盘鼠标事件、管理 OpenGL 上下文比原始的 GLUT 好用太多libglew-dev是 GLEW 扩展加载库因为 OpenGL 的函数在 Windows 上需要运行时加载在 Linux 上虽然可以直接链接但用 GLEW 能保证跨平台一致性libglm-dev是数学库处理矩阵、向量运算写相机和变换的时候离不开。如果你打算用 GLAD 而不是 GLEW那就不需要装libglew-dev而是去 GLAD 的在线生成页面下载对应的生成包。不过我个人在 Linux 上更倾向 GLEW因为 apt 直接装好CMake 查找也简单少一步手动下载的麻烦。另外如果你要用 SDL2 而不是 GLFW把libglfw3-dev换成libsdl2-dev就行。两者选一个即可不要同时用否则事件循环会打架。2.3 CLion 的安装与工具链配置CLion 本身不是必须用 apt 装的JetBrains 官方推荐用 Toolbox 管理或者直接下载 tar.gz 解压运行。我一般用 snap 装省心sudo snap install clion --classic装完之后第一次启动CLion 会让你选工具链。默认它会检测到系统自带的 GCC 和 CMake确认一下路径是/usr/bin/gcc、/usr/bin/g、/usr/bin/cmake就行。如果你的项目需要特定版本的 GCC比如 GCC 10 或 11可以在Settings Build, Execution, Deployment Toolchains里手动指定。这里有个细节CLion 自带的 CMake 版本可能和系统的不一样。我建议在工具链设置里把 CMake 指向系统安装的版本也就是/usr/bin/cmake这样和命令行构建保持一致避免出现“IDE 里能编译、终端里报错”的尴尬情况。注意Ubuntu 20.04 默认的 CMake 是 3.16对于大多数 OpenGL 项目够用了。但如果你要用一些新特性比如FetchContent的某些行为可能需要升级到 3.20 以上。升级方式可以走 Kitware 官方源但要注意别把系统包管理搞乱建议用 pip 装一个独立版本或者直接下载二进制包。3. CMake 工程配置让 CLion 正确找到 OpenGL3.1 一个最小可用的 CMakeLists.txt 模板很多人配置失败的根本原因不是库没装而是 CMakeLists 写得不完整。下面这个模板是我用了很多个项目之后沉淀下来的直接复制就能跑cmake_minimum_required(VERSION 3.16) project(OpenGLDemo LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(glfw3 REQUIRED) find_package(glm REQUIRED) add_executable(OpenGLDemo src/main.cpp ) target_link_libraries(OpenGLDemo OpenGL::GL GLEW::GLEW glfw glm::glm )这里有几个关键点值得展开说。find_package(OpenGL REQUIRED)会设置OPENGL_FOUND、OPENGL_INCLUDE_DIR、OPENGL_LIBRARIES这些变量但更推荐用OpenGL::GL这个 imported target因为它会自动处理 include 路径和链接库比手动拼变量干净得多。find_package(glfw3 REQUIRED)在 Ubuntu 20.04 上依赖libglfw3-dev提供的glfw3Config.cmake文件。如果你装的是源码编译的 GLFW可能需要手动指定glfw3_DIR。apt 装的版本一般没问题。find_package(glm REQUIRED)在 20.04 上可能会警告找不到 config 文件因为 GLM 的 CMake 支持是后来才完善的。如果报错可以退而求其次直接用 include 路径include_directories(/usr/include/glm)不过更好的做法是装libglm-dev之后确认/usr/lib/cmake/glm/目录存在。如果不存在说明这个版本的包没带 CMake config那就手动处理。3.2 链接顺序为什么这么重要C/C 链接器处理静态库时是从左到右解析符号的。如果你把OpenGL::GL放在GLEW::GLEW前面而 GLEW 又依赖 GL 的符号就可能出现undefined reference。虽然现代 CMake 的 imported target 会自动处理依赖关系但如果你手动写target_link_libraries并且用的是裸库名顺序就非常关键。我踩过的一个坑是在某个项目里同时链接了GL、GLU、GLEW、glfw结果报gluPerspective找不到。原因是 GLU 依赖 GL但我把 GLU 放在了 GL 前面。改成GL GLU GLEW glfw之后就正常了。所以记住一个原则被依赖的库放在后面依赖别人的库放在前面。用 imported target 就没这个问题因为 CMake 会自动展开依赖链。这也是我推荐用OpenGL::GL、GLEW::GLEW而不是${OPENGL_LIBRARIES}的原因。3.3 在 CLion 里配置运行时的环境变量有时候编译链接都过了但运行时报error while loading shared libraries: libGLEW.so.2.1: cannot open shared object file。这是因为动态链接器在运行时找不到库文件。虽然 apt 装的库一般都在/usr/lib/x86_64-linux-gnu/下这个路径默认在 ld 的搜索范围内但如果你自己编译了某个库装到了/usr/local/lib就需要额外配置。在 CLion 里可以在Run Edit Configurations里给可执行文件加环境变量LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH或者在 CMakeLists 里设置 RPATHset(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH /usr/local/lib)这样编译出来的可执行文件会自带库搜索路径换终端运行也不会出问题。4. 从零写一个 OpenGL 窗口程序验证环境4.1 最小 main.cpp 的结构环境配好了总得跑个东西验证一下。下面这个 main.cpp 会创建一个 800x600 的窗口清屏颜色设成深灰色按 ESC 退出。代码不长但覆盖了 GLFW 初始化、GLEW 初始化、渲染循环、资源清理这几个核心环节#include GL/glew.h #include GLFW/glfw3.h #include iostream int main() { if (!glfwInit()) { std::cerr Failed to initialize GLFW std::endl; return -1; } 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, OpenGL Demo, nullptr, nullptr); if (!window) { std::cerr Failed to create GLFW window std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glewExperimental GL_TRUE; GLenum err glewInit(); if (err ! GLEW_OK) { std::cerr Failed to initialize GLEW: glewGetErrorString(err) std::endl; glfwTerminate(); return -1; } glViewport(0, 0, 800, 600); while (!glfwWindowShouldClose(window)) { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); if (glfwGetKey(window, GLFW_KEY_ESCAPE) GLFW_PRESS) { glfwSetWindowShouldClose(window, true); } glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); return 0; }4.2 几个容易忽略的初始化细节glfwWindowHint必须在glfwCreateWindow之前调用而且如果你要 Core Profile必须同时指定 major 和 minor 版本。我见过有人只写了GLFW_CONTEXT_VERSION_MAJOR 3没写 minor结果拿到的是 3.0 上下文然后 shader 里用#version 330 core直接编译失败。glewExperimental GL_TRUE这行在 Core Profile 下几乎是必须的。因为 GLEW 默认用glGetString(GL_EXTENSIONS)来检测扩展但 Core Profile 下这个函数会返回空或者报错。设置glewExperimental之后GLEW 会改用glGetStringi来枚举扩展避免误判。还有一个坑glewInit()在 Core Profile 下可能会返回GL_INVALID_ENUM错误但这其实是 GLEW 自身的已知问题不影响使用。你可以用glGetError()清一下错误状态glewInit(); glGetError(); // 清除 GLEW 初始化产生的伪错误4.3 在 CLion 里调试 OpenGL 程序CLion 的调试器对 OpenGL 程序支持得不错但有几个设置需要调整。首先如果你在断点处停下来查看变量渲染循环会暂停窗口可能变成无响应状态这是正常的。其次如果你要看 GPU 状态CLion 本身不带 GPU 调试功能需要配合 RenderDoc 或者 apitrace 这类工具。RenderDoc 在 Ubuntu 20.04 上可以直接用 apt 装sudo apt install -y renderdoc然后在 CLion 里把 RenderDoc 的可执行文件路径配到 External Tools 里就可以一键抓帧了。抓帧的时候注意RenderDoc 需要程序在启动时注入所以要在 CLion 的 Run Configuration 里把可执行文件换成 RenderDoc 的包装命令或者直接用 RenderDoc 启动你的程序。提示如果你在 CLion 里用 WSL 或者远程开发模式RenderDoc 可能无法正常工作因为它需要直接访问 GPU 设备。这种情况下建议在本地 Linux 桌面环境下调试图形程序。5. 常见报错与排查速查5.1 编译链接阶段的典型问题报错信息根本原因解决方法undefined reference to glfwInit没有链接 glfw 库在 target_link_libraries 里加glfwundefined reference to glewInit没有链接 GLEW加GLEW::GLEW或-lGLEWGL/gl.h: No such file or directory没装 mesa 开发包sudo apt install libgl1-mesa-devglfw3Config.cmake not foundGLFW 开发包没装或路径不对sudo apt install libglfw3-devundefined reference to glm::mat4::mat4()GLM 没链接或 include 路径不对确认libglm-dev已装检查 include 路径链接错误里最隐蔽的是“符号存在但版本不匹配”。比如你系统里同时有源码编译的 GLEW 和 apt 装的 GLEWCMake 找到了头文件但链接到了另一个版本的库就会出现一些奇怪的运行时崩溃。排查方法是看ldd输出ldd ./OpenGLDemo | grep -i glew确认链接到的.so路径和你预期的一致。5.2 运行时的窗口和上下文问题GLFW window creation failed这个报错最常见的原因是显卡驱动不支持请求的 OpenGL 版本。比如你在虚拟机里请求 3.3 Core Profile但虚拟机只支持 2.1就会失败。解决办法是降低版本要求或者开启虚拟机的 3D 加速。另一个常见问题是GLX not available这通常发生在通过 SSH 远程运行图形程序的时候。X11 转发虽然能显示窗口但 OpenGL 的 GLX 扩展往往不可用因为它是直接和本地 GPU 打交道的。这种场景下要么用 VNC 连到桌面环境要么用软件渲染LIBGL_ALWAYS_SOFTWARE1但软件渲染性能很差只适合验证逻辑。还有一个坑是 Wayland 和 X11 的兼容性。Ubuntu 20.04 默认用 Wayland 会话但 GLFW 在 Wayland 下的支持不如 X11 成熟。如果你遇到窗口创建失败或者输入事件异常可以在登录界面切换到 X11 会话试试。切换方法是在登录界面点击用户名旁边的齿轮图标选“Ubuntu on Xorg”。5.3 性能相关的隐性问题有时候程序能跑但帧率异常低比如一个简单三角形只有 10 FPS。这种情况先检查是不是用了软件渲染glxinfo | grep OpenGL renderer如果显示llvmpipe或者softpipe说明你在用 CPU 渲染。原因可能是驱动没装好或者LIBGL_ALWAYS_SOFTWARE环境变量被设置了。检查一下echo $LIBGL_ALWAYS_SOFTWARE如果有输出在 CLion 的 Run Configuration 里把它删掉。另一个性能陷阱是垂直同步。GLFW 默认会开启 vsync也就是glfwSwapInterval(1)这会把帧率锁在显示器刷新率。如果你在测性能记得关掉glfwSwapInterval(0);6. 进阶配置让开发体验更顺滑6.1 用 CMake Presets 统一构建配置CLion 从 2021.1 开始支持 CMake Presets这个功能在多配置项目里特别有用。你可以在项目根目录建一个CMakePresets.json{ version: 3, configurePresets: [ { name: debug, generator: Ninja, binaryDir: ${sourceDir}/build/debug, cacheVariables: { CMAKE_BUILD_TYPE: Debug, CMAKE_EXPORT_COMPILE_COMMANDS: ON } }, { name: release, generator: Ninja, binaryDir: ${sourceDir}/build/release, cacheVariables: { CMAKE_BUILD_TYPE: Release } } ] }然后在 CLion 的 Settings 里启用 CMake Presets就可以在 Debug 和 Release 之间一键切换不用手动改 CMake options。CMAKE_EXPORT_COMPILE_COMMANDS打开之后会生成compile_commands.jsonCLion 的代码分析会更准确跳转和补全也更靠谱。6.2 集成 clang-format 和静态检查图形项目的代码里经常有大量的矩阵和向量运算格式容易乱。在项目根目录放一个.clang-formatBasedOnStyle: Google IndentWidth: 4 ColumnLimit: 100 AllowShortFunctionsOnASingleLine: Inline然后在 CLion 里设置Settings Editor Code Style Enable ClangFormat保存时自动格式化。配合clang-tidy做静态检查能提前发现一些未初始化变量、内存泄漏的隐患。CLion 内置了 clang-tidy 集成在Settings Editor Inspections C/C General Clang-Tidy里开启就行。6.3 用 Git 管理项目时的忽略规则OpenGL 项目的 build 目录、IDE 配置、编译产物都不应该进版本库。一个典型的.gitignorebuild/ cmake-build-*/ .idea/ *.o *.so *.a compile_commands.json注意.idea目录虽然包含 CLion 的项目配置但不同人的路径和工具链设置不一样提交上去反而会造成冲突。团队协作时建议只提交CMakeLists.txt和源码IDE 配置各自本地生成。7. 我踩过的几个印象深刻的坑第一个坑是 GLFW 的线程安全问题。我曾经在一个多线程渲染的项目里在非主线程调用glfwPollEvents()结果程序随机崩溃。后来查文档才知道GLFW 的所有窗口和事件函数都必须在主线程调用只有glfwPostEmptyEvent()可以从其他线程调用来唤醒主线程的事件循环。这个限制在 Windows 上没那么明显但在 Linux 的 X11 下会直接段错误。第二个坑是 GLEW 和 Core Profile 的兼容性。前面提过glewExperimental要设 true但还有一个细节在 Core Profile 下glGetString(GL_EXTENSIONS)会返回 NULL如果你用的第三方库内部调用了这个函数可能会崩溃。解决办法是确保所有扩展检测都走 GLEW 的glewIsSupported()或者GLEW_xxx宏不要直接调glGetString。第三个坑是 CMake 的find_package缓存。有时候你改了库的安装路径但 CMake 还是用旧的缓存导致链接到错误的版本。这时候需要删掉CMakeCache.txt重新配置rm -rf build/ CMakeCache.txt在 CLion 里就是Tools CMake Reset Cache and Reload Project。这个操作我至少做过几十次每次换库版本或者换工具链之后都要来一遍。第四个坑是关于高 DPI 屏幕的。在 4K 显示器上GLFW 创建的窗口默认尺寸是按像素算的但 UI 元素会显得特别小。需要在创建窗口前设置glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE);然后在渲染循环里用glfwGetFramebufferSize而不是glfwGetWindowSize来设置 viewport否则画面会被拉伸。8. 后续可以扩展的方向环境跑通之后下一步自然是往里面填内容。如果你做的是渲染方向可以接着搞 shader 编译、VAO/VBO 管理、纹理加载、帧缓冲这些。如果你做的是计算方向可以研究 compute shader 和 SSBO。如果你做的是工具方向可以集成 ImGui 做界面或者接 Assimp 做模型加载。我个人建议在环境配好之后先写一个带 shader 编译错误日志的封装类把glGetShaderInfoLog的输出打到控制台。这个习惯能帮你省下大量调试 shader 的时间因为 OpenGL 的 shader 编译错误如果不主动查询是不会有任何提示的只会默默渲染出黑屏。另外如果你打算长期在 Linux 上做图形开发建议把 Mesa 的调试工具也装上sudo apt install -y mesa-utils apitraceapitrace可以录制 OpenGL 调用序列并回放分析每一帧的 draw call 和状态设置排查渲染问题时非常有用。它的使用方式和 RenderDoc 类似但更轻量适合快速定位问题。整套环境配下来从零到能跑一个窗口熟练的话大概 20 分钟。第一次配可能会花一两个小时踩坑但把这些坑记下来之后换机器或者重装系统就是复制粘贴的事。我在实际使用中发现把依赖安装命令和 CMakeLists 模板存成一个脚本或者项目模板下次直接复用效率会高很多。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号