Ubuntu 搭建 GLFW 环境及其相关测试 demo

2024-09-01 07:28

本文主要是介绍Ubuntu 搭建 GLFW 环境及其相关测试 demo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 1.系统信息:Ubuntu-22.04.1
      • 2.依赖库安装
      • 3.解压编译
      • 4.测试 demo 1 窗体
      • 5.测试 demo2 三角形
      • 6.键盘事件、图像显示

GLFW (Graphics Library Framework) 是一个开源的跨平台库,专门用于创建和管理 OpenGLVulkan 上下文、窗口及其他与图形渲染相关的任务。它的主要用途包括创建窗口、处理用户输入(例如键盘和鼠标事件)、以及管理 OpenGLVulkan 的上下文。

glfw 渲染图片效果
在这里插入图片描述

1.系统信息:Ubuntu-22.04.1

[jn@jn glfw-3.4]$ uname -a
Linux jn 6.5.0-28-generic #29~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Apr  4 14:39:20 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
[jn@jn glfw-3.4]$

2.依赖库安装

# GLFW依赖
sudo apt-get install -y libx11-dev
sudo apt-get install -y libxrandr-dev
sudo apt-get install -y libxinerama-dev
sudo apt-get install -y libxcursor-dev
sudo apt-get install -y libxi-dev
# 测试程序编译依赖
sudo apt-get install -y libglu1-mesa-dev freeglut3-dev mesa-common-dev

3.解压编译

①下载GLFW库:
https://github.com/glfw/glfw/releases
https://github.com/glfw/glfw/archive/refs/tags/3.4.tar.gz

②编译:

[jn@jn GLFW]$ unzip glfw-3.4.zip 
Archive:  glfw-3.4.zipcreating: glfw-3.4/creating: glfw-3.4/CMake/
...
[jn@jn GLFW]$ cd glfw-3.4/
[jn@jn GLFW]$ cmake -S . -B build -DGLFW_BUILD_WAYLAND=OFF -DGLFW_BUILD_X11=ON -DCMAKE_INSTALL_PREFIX=$PWD/../glfw #生成cmake编译过程文件
-- Including X11 support
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
-- Documentation generation requires Doxygen 1.9.8 or later
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jn/Desktop/GLFW/glfw-3.4/build
[jn@jn GLFW]$

Doxygen:接口文档生成,不重要


  • cmake -S . -B build 一些错误解决办法:
  1. Failed to find wayland-scanner
    使用cmake -S . -B build -DGLFW_BUILD_WAYLAND=OFF -DGLFW_BUILD_X11=ON

  2. 带了 wayland关闭和X11开启还是报错

CMake Error at CMakeLists.txt:31 (message):GLFW_USE_WAYLAND has been removed; delete the CMake cache and setGLFW_BUILD_WAYLAND and GLFW_BUILD_X11 instead

之前没参数-DGLFW_BUILD_WAYLAND=OFF -DGLFW_BUILD_X11=ON,会有残留,需要清理重编译:

[jn@jn glfw-3.4]$ cmake -S . -B build -DGLFW_BUILD_WAYLAND=OFF -DGLFW_BUILD_X11=ON
CMake Error at CMakeLists.txt:31 (message):GLFW_USE_WAYLAND has been removed; delete the CMake cache and setGLFW_BUILD_WAYLAND and GLFW_BUILD_X11 instead-- Configuring incomplete, errors occurred!
See also "/home/jn/Desktop/GLFW/glfw-3.4/build/CMakeFiles/CMakeOutput.log".
[jn@jn glfw-3.4]$ rm -rf build CMakeCache.txt

3.Could NOT find X11 (missing: X11_X11_INCLUDE_PATH X11_X11_LIB)

sudo apt-get install -y libx11-dev

4.RandR headers not found; install libxrandr development package

sudo apt-get install libxrandr-dev

5.Xinerama headers not found; install libxinerama development package

sudo apt-get install -y libxinerama-dev

6.Xcursor headers not found; install libxcursor development package

sudo apt-get install libxcursor-dev

7.XInput headers not found; install libxi development package

sudo apt-get install libxi-dev

4.测试 demo 1 窗体

①目录:

[jn@jn GLFW]$ tree -L 2
.
├── glfw
│   ├── include
│   └── lib
└── test├── CMakeLists.txt└── main.cpp
[jn@jn GLFW]$

②CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(glfwTest)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)# 查找GLFW库
find_package(glfw3 3.3 REQUIRED PATHS ../glfw)
find_package(OpenGL REQUIRED)# 添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)# 链接GLFW和OpenGL
target_link_libraries(${PROJECT_NAME} glfw OpenGL::GL)

③main.cpp

#include <GLFW/glfw3.h>
#include <iostream>int main() {// 初始化GLFW库if (!glfwInit()) {std::cerr << "Failed to initialize GLFW" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(800, 600, "GLFW Window For Jn", nullptr, nullptr);if (!window) {std::cerr << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// 设置上下文为当前窗口glfwMakeContextCurrent(window);// 主循环while (!glfwWindowShouldClose(window)) {// 清空颜色缓冲glClear(GL_COLOR_BUFFER_BIT);// 交换前后缓冲glfwSwapBuffers(window);// 处理事件glfwPollEvents();}// 清理并退出glfwDestroyWindow(window);glfwTerminate();return 0;
}

④编译:

[jn@jn test]$ cmake -S . -B build
...
[jn@jn test]$ cd build;make
Consolidate compiler generated dependencies of target glfwTest
[100%] Built target glfwTest
[jn@jn build]$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  glfwTest  Makefile
[jn@jn build]$ ./glfwTest

在这里插入图片描述

其他问题:
:cmake 找不到 OpenGL

Could NOT find OpenGL (missing: OPENGL_opengl_LIBRARY OPENGL_glx_LIBRARYOPENGL_INCLUDE_DIR)

安装依赖:

sudo apt-get install -y libglu1-mesa-dev freeglut3-dev mesa-common-dev

5.测试 demo2 三角形

①依赖glad
在官网根据需求生成源码:https://glad.dav1d.de/

可以查看本机 OpenGL 版本:

[jn@jn glad-2.0.6]$ glxinfo|grep version
server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4Max core profile version: 4.5Max compat profile version: 4.5Max GLES1 profile version: 1.1Max GLES[23] profile version: 3.2
OpenGL core profile version string: 4.5 (Core Profile) Mesa 23.2.1-1ubuntu3.1~22.04.2
OpenGL core profile shading language version string: 4.50
OpenGL version string: 4.5 (Compatibility Profile) Mesa 23.2.1-1ubuntu3.1~22.04.2
OpenGL shading language version string: 4.50
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 23.2.1-1ubuntu3.1~22.04.2
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20GL_EXT_shader_implicit_conversions, GL_EXT_shader_integer_mix,
[jn@jn glad-2.0.6]$ 

根据版本选择,点击右下角 GENENATE 会生成源码,下载集成到自己源码中即可
在这里插入图片描述
在这里插入图片描述

②代码
我是这么放的:

[jn@jn triangle]$ tree
.
├── CMakeLists.txt
├── glad.zip
├── include
│   ├── glad
│   │   └── glad.h
│   └── KHR
│       └── khrplatform.h
├── main.cpp
└── src└── glad.c
[jn@jn triangle]$

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(glfwTest)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)INCLUDE_DIRECTORIES(
./include
)# 查找GLFW库
find_package(glfw3 3.3 REQUIRED PATHS ../glfw)
find_package(OpenGL REQUIRED)# 添加可执行文件
add_executable(${PROJECT_NAME} main.cpp src/glad.c)# 链接GLFW和OpenGL
target_link_libraries(${PROJECT_NAME} glfw OpenGL::GL)

main.cpp

#include <glad/glad.h>  // 需要使用GLAD加载OpenGL函数
#include <GLFW/glfw3.h>
#include <iostream>const char* vertexShaderSource = R"(
#version 330 core
layout(location = 0) in vec3 aPos;
void main() {gl_Position = vec4(aPos, 1.0);
}
)";const char* fragmentShaderSource = R"(
#version 330 core
out vec4 FragColor;
void main() {FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
}
)";int main() {if (!glfwInit()) {std::cerr << "Failed to initialize GLFW" << std::endl;return -1;}GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Triangle", nullptr, nullptr);if (!window) {std::cerr << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {std::cerr << "Failed to initialize GLAD" << std::endl;return -1;}unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);glCompileShader(vertexShader);unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);glCompileShader(fragmentShader);unsigned int shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);glDeleteShader(vertexShader);glDeleteShader(fragmentShader);float vertices[] = {0.0f,  0.5f, 0.0f,-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f};unsigned int VAO, VBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)) {glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);glfwSwapBuffers(window);glfwPollEvents();}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glfwDestroyWindow(window);glfwTerminate();return 0;
}

注意:这里有个坑,需要将glad/glad.h头文件放在glfw前面,先包含glad头文件,否则glad报错

[jn@jn build]$ make
Consolidate compiler generated dependencies of target glfwTest
[ 33%] Building CXX object CMakeFiles/glfwTest.dir/main.cpp.o
In file included from /home/jn/Desktop/GLFW/triangle/main.cpp:4:
/home/jn/Desktop/GLFW/triangle/./include/glad/glad.h:27:2: error: #error OpenGL header already included, remove this include, glad already provides it27 | #error OpenGL header already included, remove this include, glad already provides it|  ^~~~~
/home/jn/Desktop/GLFW/triangle/./include/glad/glad.h:1321: warning: "GL_INVALID_INDEX" redefined1321 | #define GL_INVALID_INDEX 0xFFFFFFFF|
In file included from /usr/include/GL/gl.h:2050,from /home/jn/Desktop/GLFW/glfw/include/GLFW/glfw3.h:241,from /home/jn/Desktop/GLFW/triangle/main.cpp:1:
/usr/include/GL/glext.h:1355: note: this is the location of the previous definition1355 | #define GL_INVALID_INDEX                  0xFFFFFFFFu

③编译:

[jn@jn triangle]$ cmake -S . -B build
[jn@jn triangle]$ cd build;make
[ 33%] Building CXX object CMakeFiles/glfwTest.dir/main.cpp.o
[ 66%] Building C object CMakeFiles/glfwTest.dir/src/glad.c.o
[100%] Linking CXX executable glfwTest
[100%] Built target glfwTest
[jn@jn build]$ ./glfwTest

④结果:
在这里插入图片描述

6.键盘事件、图像显示

贴代码太多,不再一一列出代码:
① 键盘事件监控:
在这里插入图片描述
图像显示:
在这里插入图片描述

这篇关于Ubuntu 搭建 GLFW 环境及其相关测试 demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126308

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

如何评价Ubuntu 24.04 LTS? Ubuntu 24.04 LTS新功能亮点和重要变化

《如何评价Ubuntu24.04LTS?Ubuntu24.04LTS新功能亮点和重要变化》Ubuntu24.04LTS即将发布,带来一系列提升用户体验的显著功能,本文深入探讨了该版本的亮... Ubuntu 24.04 LTS,代号 Noble NumBAT,正式发布下载!如果你在使用 Ubuntu 23.

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

如何安装 Ubuntu 24.04 LTS 桌面版或服务器? Ubuntu安装指南

《如何安装Ubuntu24.04LTS桌面版或服务器?Ubuntu安装指南》对于我们程序员来说,有一个好用的操作系统、好的编程环境也是很重要,如何安装Ubuntu24.04LTS桌面... Ubuntu 24.04 LTS,代号 Noble NumBAT,于 2024 年 4 月 25 日正式发布,引入了众

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har