[wsl2] wsl2上安装使用cmake+OpenGL教程
一、前提
- 系统为windows11,并且使用wsl2(ubuntu);
- ubuntu中安装了基本的g++, cmake编译工具;
- 在windows中使用X-Server作为wsl2的显示GUI;
二、安装OpenGL
安装opengl的基本步骤为:安装glfw->安装glad->修改OpenGL渲染方式->编写C++代码运行
。下面是详细步骤:
OpenGL, GLFW 和 GLAD 的简要说明(glfw和glad有什么区别呢-coskgid的回答):
- OpenGL:是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。
- GLFW:是一个专门针对OpenGL的C语言库,提供了一些渲染物体所需的最低限度的接口。它帮助用户创建OpenGL上下文、定义窗口参数以及处理用户键盘鼠标输入;
- GLAD:是用来管理OpenGL的函数指针的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
1. 安装 GLFW
- 去GLFW官网下载glfw源代码,本文假设文件名为
glfw-3.3.8.zip
; - 将
glfw-3.3.8.zip
复制到ubuntu
中,本文假设将文件复制到/home/user/
目录下; - 在
/home/user/
目录下解压glfw-3.3.8.zip
:unzip glfw-3.3.8.zip
- 编译并安装
glfw
:# 进入 解压目录 cd glfw-3.3.8 # 新建build目录 用于存储编译glfw的文件 mkdir build # 进入build目录 cd build # 使用cmake生成Makefile文件用于编译glfw cmake .. # 编译安装 glfw sudo make install
若编译安装成功,在/usr/local/include/
目录下应该存在GLFW
头文件目录,在/usr/local/lib/
目录下存在libglfw3.a
链接库文件。
2. 安装 glad
- 查看系统的
OpenGL
版本glxinfo | grep "OpenGL version"
如果没有
glxinfo
命令需要先安装mesa-utils
, 安装命令如下:sudo apt-get install mesa-utils
可能的显示结果如下:
~$ glxinfo | grep "OpenGL version"
OpenGL version string: 4.1 (Compatibility Profile) Mesa 22.2.5-0ubuntu0.1~22.04.3
可以看到我的电脑OpenGL
版本为4.1
。
2. 去glad官网在gl
下拉框中选择对应版本,本文中选择4.1
。将profile
设置为Core
,其他不用边,点击最后的GENERATE
按钮,会自动生成需要的glad.zip
文件,点击下载glad.zip
。
3. glad.zip
解压后文件结构如下:
.
├── include
│ ├── KHR
│ │ └── khrplatform.h
│ └── glad
│ └── glad.h
└── src
└── glad.c
将include/
中的KHR/
和glad/
目录复制到usr/local/include/
目录下。
将src/
目录下的glad.c
暂时不管(glad.c
需要放到编写的C++代码工程中,在4.编写代码运行
部分有示例)。
3. 修改渲染方式为direct render
将OpenGL
渲染方式改为direct render
,如果不修改运行opengl程序时可能会出现Failed to create GLFW window
报错。
修改方式如下:
将下面一句话写入~/.bashrc
文件里
# 设置opengl 直接渲染, 用于使用 x-service 显示glfw窗口
LIBGL_ALWAYS_INDIRECT=0
使.bashrc
文件生效
source .barshrc
4. 编写代码运行
wsl2下使用C++, cmake, OpenGL的示例代码如下:
- 将步骤
2. 安装 glad
中的glad.c
文件复制到main.cpp
同目录下; - 代码内容:
main.cpp
文件:#include <glad/glad.h> #include <GLFW/glfw3.h> int main(void) { GLFWwindow* window; /* Initialize the library */ if (!glfwInit()) return -1; /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(640, 480, "GLFW CMake starter", NULL, NULL); if (!window) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); /* 使用 glad 管理函数地址 */ gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); glClearColor( 1.0f, 0.3f, 0.4f, 0.0f ); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { /* Render here */ glClear(GL_COLOR_BUFFER_BIT); /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; }
CMakeLists.txt
文件:cmake_minimum_required(VERSION 3.10) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 14) project(test) find_package(glfw3 REQUIRED) file(GLOB project_file main.cpp glad.c) add_executable(${PROJECT_NAME} ${project_file}) target_link_libraries(${PROJECT_NAME} glfw)
- 编译运行示例程序:
mkdir build cd build cmake .. make # 运行示例程序 ./test
运行结果如下:
三、参考
1.Compiling GLFW-Generating files with CMake
2.Building applications-With CMake and GLFW source
3.Context guide-Loading extension with a loader library