【OpenGL ES】Windows上OpenGL环境搭建

news/2025/10/7 12:00:46/文章来源:https://www.cnblogs.com/zhyan8/p/19123022

1 前言

​ Windows 的图形 API 是 DirectX,对 OpenGL 的支持比较有限(系统自带的 opengl32.dll 仅支持 OpenGL 1.1 版本),因此在 Windows 上进行OpenGL 开发时,通常需要借助第三方库或工具来支持更高版本的 OpenGL 功能。

​ 目前主流的方案 GLFW / freeglut + Glad / GLEW。其中 GLFW 和 freeglut 都是用于管理 OpenGL 上下文、窗口、输入的开源库,它们可以相互替换;Glad 和 GLEW 都是用于管理 OpenGL 函数指针加载的库(即 OpenGL 加载库),它们也可以相互替换。因此有 4 种搭配方式:GLFW + Glad、GLFW + GLEW、freeglut + Glad、freeglut + GLEW。

GLFW 和 freeglut 的区别如下。

特性 GLFW freeglut
设计目标 现代轻量级上下文管理 GLUT 兼容,教学 / 原型开发
API 风格 直接、灵活 回调驱动,固定流程
OpenGL 工具 提供几何绘制等工具函数
输入处理 直接访问输入状态 通过回调机制
Vulkan 支持
多线程支持 友好 有限
适用场景 高性能应用、游戏、Vulkan 项目 教学、旧项目维护、快速原型

​ Glad 和 GLEW 的区别如下。

特性 Glad GLEW
生成方式 通过在线生成器或工具生成定制代码 预编译的通用库(支持大多数扩展)
灵活性 高度灵活(可选择 API 版本和扩展) 相对固定(默认加载所有支持的扩展)
维护状态 活跃维护(现代 OpenGL 首选) 维护较少(旧项目中使用较多)
初始化 需显式调用 gladLoadGL() 需显式调用 glewInit()
头文件 仅需 glad/glad.h(单头文件) 需 GL/glew.h + 链接库
扩展控制 生成时选择扩展,减少冗余 默认加载所有扩展,可能冗余
兼容性 支持 OpenGL ES、Vulkan 等 主要专注 OpenGL

​ 由上述对比可知,GLFW + Glad 是 4 种搭配方式中的最推荐的搭配方式。

​ 本文所有 Demo 的完整代码见 → Windows上 GLFW + Glad、GLFW + GLEW、freeglut + Glad、freeglut + GLEW 环境搭建。

2 环境搭建

​ 本节将介绍 GLFW、freeglut、Glad、GLEW 的环境搭建,用户可以根据运行搭配情况,选择部分依赖库搭建到自己的项目中。

​ 为了让项目具有更好的兼容性和跨平台特性,本文基于 CMake 进行环境搭建。首先创建一个项目目录 glDemo,接着在 glDemo 中创建一个子目录 thirdParty,用于存放三方库文件,在 thirdParty 中创建 bin、include、lib、src 目录,分别用于存放二进制文件(.dll)、头文件(.h / .hpp)、库文件(.lib)、源文件(.c / .cpp),如下。

glDemo└─thirdParty├─bin├─include├─lib└─src

2.1 GLFW 环境搭建

​ 打开网站 https://www.glfw.org/download.html,点击以下按钮下载。

img

​ glfw-3.4.bin.WIN64.zip 的内容如下。

img

​ 将 include 下面的所有文件复制到 thirdParty/include 中,将 lib-vc2022/glfw3.lib 复制到 thirdParty/lib/GLFW 中,复制后的目录结构如下。

glDemo└─thirdParty├─include│    └─GLFW└─lib└─GLFW└─glfw3.lib

​ 如果用户想自己编译源码,可以去 https://github.com/glfw/glfw/releases 中下载源码,如 glfw-3.4.zip。

img

​ 解压后在根目录创建 build 目录,在 build 目录中创建 install 目录,用 CMake 配置如下。

img

​ 进入 build 目录中,双击 GLFW.sln 文件,会自动用 Visual Studio 打开项目,右键 ALL_BUILD,点击生成;再右键 INSTALL,点击生成。

img

​ 在 install 目录下面会生成以下文件,将 include 下面的所有文件复制到 thirdParty/include 中,将 lib/glfw3.lib 复制到 thirdParty/lib/GLFW 中。

img

2.2 freeglut 环境搭建

​ 打开网站 https://freeglut.sourceforge.net/index.php#download,点击以下按钮下载。用户也可以去 github 上下载(https://github.com/freeglut/freeglut/releases)。

img

​ freeglut-3.6.0.tar.gz 的内容如下。

img

​ 解压后在根目录创建 build 目录,在 build 目录中创建 install 目录,用 CMake 配置如下。

img

​ 进入 build 目录中,双击 freeglut.sln 文件,会自动用 Visual Studio 打开项目,右键 ALL_BUILD,点击生成;再右键 INSTALL,点击生成。

img

​ 由于 freeglut 的 Debug 和 Release 版本生成的资源命名不一样,为了让项目能够在 Debug 和 Release 版本都能运行,需要将分别选择 Debug 和 Release 版本,都按照上述步骤生成一遍。

img

​ 在 install 目录下面会生成以下文件,带 d 后缀的文件(如:freeglutd.dll、freeglut_staticd.lib)是 Debug 版本的。

img

​ 将 include 下面的所有文件复制到 thirdParty/include 中,将 lib 下面的 freeglut.lib 和 freeglutd.lib 复制到 thirdParty/lib/freeglut 中,将 bin 下面的 freeglut.dll 和 freeglutd.dll 复制到 thirdParty/bin/freeglut 中,复制后的目录结构如下。

glDemo└─thirdParty├─bin│    └─freeglut│         ├─freeglut.dll│         └─freeglutd.dll├─include│    └─GL└─lib└─freeglut├─freeglut.lib└─freeglutd.lib

2.3 Glad 环境搭建

​ 打开网站 https://glad.dav1d.de/,根据需要进行配置,笔者的配置如下。

img

​ 配置完后点击底部的【GENERATE】按钮,下载 glad.zip。

img

​ glad.zip 的内容如下。

img

​ 将 include 下面的所有文件复制到 thirdParty/include 中,将 src 下面的所有文件复制到 thirdParty/src/glad 中,复制后的目录结构如下。

glDemo└─thirdParty├─include│    ├─glad│    └─KHR└─src└─glad└─glad.c

2.4 GLEW 环境搭建

​ 打开网站 https://glew.sourceforge.net/,点击以下按钮下载。用户也可以去 github 上下载(https://github.com/nigels-com/glew/releases),但是需要自己编译源码。

img

​ glew-2.1.0-win32.zip 的内容如下。

img

​ 将 include 下面的所有文件复制到 thirdParty/include 中,将 lib/Release/x64/glew32s.lib 复制到 thirdParty/lib/GLEW 中,复制后的目录结构如下。

glDemo└─thirdParty├─include│    └─GL└─lib└─GLEW└─glew32s.lib

3 运行搭配

3.1 GLFW + Glad 搭配

​ 项目目录结构如下。

img

​ CMakeLists.txt

# 项目要求的最小CMake版本
cmake_minimum_required(VERSION 3.12)# 声明项目名, 可以通过${PROJECT_NAME}访问, 在顶层CMakeLists.txt中, 也可以通过${CMAKE_PROJECT_NAME}访问
project("glDemo")# 设置C++版本号
set(CMAKE_CXX_STANDARD 17)message("BUILD TYPE: ${CMAKE_BUILD_TYPE}")# 头文件目录列表 (便于以该路径为相对路径访问头文件)
include_directories(./thirdParty/include)link_directories(./thirdParty/lib/GLFW)# 源文件列表 (相对于当前CMakeLists.txt的路径)
file(GLOB_RECURSE SOURCES"thirdParty/src/**/*.c""main.cpp")message("source: ${SOURCES}")# 添加可执行目标
add_executable(${CMAKE_PROJECT_NAME} ${SOURCES})# 添加链接的三方库文件
target_link_libraries(${CMAKE_PROJECT_NAME}glfw3)

​ main.cpp

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>using namespace std;// 窗口尺寸变化回调函数
void resizeCallback(GLFWwindow* window, int width, int height)
{cout << "窗口尺寸变化, " << width << ", " << height << endl;
}// 按键事件回调函数
void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{cout << "键盘事件, " << key << ", " << scancode << ", " << action << ", " << mods << endl;
}// 鼠标按键回调函数
void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
{cout << "鼠标按键事件, " << button << ", " << action << ", " << mods << endl;
}// 光标进出窗口回调函数
void cursorEnterCallback(GLFWwindow* window, int entered)
{cout << "光标进出窗口事件, " << entered << endl;
}// 光标移动回调函数
void cursorMoveCallback(GLFWwindow* window, double xpos, double ypos)
{cout << "光标移动事件, " << xpos << ", " << xpos << endl;
}// 滚轮滑动回调函数
void scrollCallback(GLFWwindow* window, double xoffset, double yoffset)
{cout << "滚轮事件, " << xoffset << ", " << yoffset << endl;
}// 关闭窗口回调
void closeCallback(GLFWwindow* window)
{cout << "关闭窗口回调" << endl;
}// 注册监听器
void registerListeners(GLFWwindow* window)
{glfwSetFramebufferSizeCallback(window, resizeCallback);glfwSetKeyCallback(window, keyCallback);glfwSetMouseButtonCallback(window, mouseButtonCallback);glfwSetCursorEnterCallback(window, cursorEnterCallback);glfwSetCursorPosCallback(window, cursorMoveCallback);glfwSetScrollCallback(window, scrollCallback);glfwSetWindowCloseCallback(window, closeCallback);
}int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 主版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); // 次版本号glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用核心模式GLFWwindow* window = glfwCreateWindow(500, 500, "glDemo", NULL, NULL); // 窗体对象glfwMakeContextCurrent(window); // 设置当前窗体为OpenGL绘制舞台registerListeners(window); // 注册监听器// 加载 OpenGL API 指令if (!gladLoadGL()){cout << "Failed to initialize GLAD" << endl;glfwTerminate();return -1;}glClearColor(0.1f, 0.2f, 0.3f, 1.0f);while (!glfwWindowShouldClose(window)){glfwPollEvents(); // 接收并分发窗口消息glClear(GL_COLOR_BUFFER_BIT);glfwSwapBuffers(window);}glfwDestroyWindow(window);glfwTerminate();return 0;
}

​ 运行效果如下。

img

3.2 GLFW + GLEW 搭配

​ 项目目录结构如下。

img

​ CMakeLists.txt

# 项目要求的最小CMake版本
cmake_minimum_required(VERSION 3.12)# 声明项目名, 可以通过${PROJECT_NAME}访问, 在顶层CMakeLists.txt中, 也可以通过${CMAKE_PROJECT_NAME}访问
project("glDemo")# 设置C++版本号
set(CMAKE_CXX_STANDARD 17)message("BUILD TYPE: ${CMAKE_BUILD_TYPE}")# 头文件目录列表 (便于以该路径为相对路径访问头文件)
include_directories(./thirdParty/include)link_directories(./thirdParty/lib/GLFW./thirdParty/lib/GLEW)# 源文件列表 (相对于当前CMakeLists.txt的路径)
file(GLOB_RECURSE SOURCES "main.cpp")message("source: ${SOURCES}")# 添加可执行目标
add_executable(${CMAKE_PROJECT_NAME} ${SOURCES})# 添加链接的三方库文件
target_link_libraries(${CMAKE_PROJECT_NAME}opengl32glew32sglfw3)

​ main.cpp

#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>using namespace std;// 窗口尺寸变化回调函数
void resizeCallback(GLFWwindow* window, int width, int height)
{cout << "窗口尺寸变化, " << width << ", " << height << endl;
}// 按键事件回调函数
void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{cout << "键盘事件, " << key << ", " << scancode << ", " << action << ", " << mods << endl;
}// 鼠标按键回调函数
void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
{cout << "鼠标按键事件, " << button << ", " << action << ", " << mods << endl;
}// 光标进出窗口回调函数
void cursorEnterCallback(GLFWwindow* window, int entered)
{cout << "光标进出窗口事件, " << entered << endl;
}// 光标移动回调函数
void cursorMoveCallback(GLFWwindow* window, double xpos, double ypos)
{cout << "光标移动事件, " << xpos << ", " << xpos << endl;
}// 滚轮滑动回调函数
void scrollCallback(GLFWwindow* window, double xoffset, double yoffset)
{cout << "滚轮事件, " << xoffset << ", " << yoffset << endl;
}// 注册监听器
void registerListeners(GLFWwindow* window)
{glfwSetFramebufferSizeCallback(window, resizeCallback);glfwSetKeyCallback(window, keyCallback);glfwSetMouseButtonCallback(window, mouseButtonCallback);glfwSetCursorEnterCallback(window, cursorEnterCallback);glfwSetCursorPosCallback(window, cursorMoveCallback);glfwSetScrollCallback(window, scrollCallback);
}int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 主版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); // 次版本号glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用核心模式GLFWwindow* window = glfwCreateWindow(500, 500, "glDemo", NULL, NULL); // 窗体对象glfwMakeContextCurrent(window); // 设置当前窗体为OpenGL绘制舞台registerListeners(window); // 注册监听器// 加载 OpenGL API 指令glewExperimental = GL_TRUE; // 确保GLEW能使用现代OpenGL方法if (glewInit() != GLEW_OK){cout << "Failed to initialize GLEW" << endl;glfwTerminate();return -1;}glClearColor(0.1f, 0.2f, 0.3f, 1.0f);while (!glfwWindowShouldClose(window)){glfwPollEvents(); // 接收并分发窗口消息glClear(GL_COLOR_BUFFER_BIT);glfwSwapBuffers(window);}glfwTerminate();return 0;
}

3.3 freeglut + Glad 搭配

​ 项目目录结构如下。

img

​ CMakeLists.txt

# 项目要求的最小CMake版本
cmake_minimum_required(VERSION 3.12)# 声明项目名, 可以通过${PROJECT_NAME}访问, 在顶层CMakeLists.txt中, 也可以通过${CMAKE_PROJECT_NAME}访问
project("glDemo")# 设置C++版本号
set(CMAKE_CXX_STANDARD 17)message("BUILD TYPE: ${CMAKE_BUILD_TYPE}")file(GLOB ASSETS "./thirdParty/bin/**/*.dll")file(COPY ${ASSETS} DESTINATION ${CMAKE_BINARY_DIR})# 头文件目录列表 (便于以该路径为相对路径访问头文件)
include_directories(./thirdParty/include)link_directories(./thirdParty/lib/freeglut)# 源文件列表 (相对于当前CMakeLists.txt的路径)
file(GLOB_RECURSE SOURCES"thirdParty/src/**/*.c""main.cpp")message("source: ${SOURCES}")# 添加可执行目标
add_executable(${CMAKE_PROJECT_NAME} ${SOURCES})# 添加链接的三方库文件
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")target_link_libraries(${CMAKE_PROJECT_NAME} freeglutd)
else ()target_link_libraries(${CMAKE_PROJECT_NAME} freeglut)
endif ()

​ main.cpp

#include <glad/glad.h>
#include <GL/freeglut.h>
#include <iostream>using namespace std;// 窗口尺寸变化回调函数
void resizeCallback(int width, int height)
{cout << "窗口尺寸变化, " << width << ", " << height << endl;
}// 按键事件回调函数
void keyCallback(unsigned char key, int xpos, int ypos)
{cout << "键盘事件, " << key << ", " << xpos << ", " << ypos << endl;
}// 特殊按键事件回调函数 (功能键、方向键等)
void specialKeyCallback(int key, int xpos, int ypos)
{cout << "特殊键盘事件, " << key << ", " << xpos << ", " << ypos << endl;
}// 鼠标按键回调函数
void mouseButtonCallback(int button, int state, int xpos, int ypos)
{cout << "鼠标按键事件, " << button << ", " << state << ", " << xpos << ", " << ypos << endl;
}// 光标进出窗口回调函数
void cursorEnterCallback(int state)
{cout << "光标进出窗口事件, " << state << endl;
}// 光标移动回调函数
void cursorMoveCallback(int xpos, int ypos)
{cout << "光标移动, " << xpos << ", " << xpos << endl;
}// 光标拖拽回调函数
void cursorDragCallback(int xpos, int ypos)
{cout << "光标拖拽, " << xpos << ", " << ypos << endl;
}// 滚轮滑动回调函数
void scrollCallback(int wheel, int direction, int xpos, int ypos)
{cout << "滚轮事件, " << wheel << ", " << direction << ", " << xpos << ", " << ypos << endl;
}// 关闭窗口回调
void closeCallback()
{cout << "关闭窗口回调" << endl;
}// 渲染回调
void drawCallback()
{glClear(GL_COLOR_BUFFER_BIT);glutSwapBuffers();glutPostRedisplay(); // 请求下一帧(创建循环)
}// 注册监听器
void registerListeners()
{glutReshapeFunc(resizeCallback);glutKeyboardFunc(keyCallback);glutSpecialFunc(specialKeyCallback);glutMouseFunc(mouseButtonCallback);glutEntryFunc(cursorEnterCallback);glutPassiveMotionFunc(cursorMoveCallback);glutMotionFunc(cursorDragCallback);glutMouseWheelFunc(scrollCallback);glutCloseFunc(closeCallback);
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitContextVersion(3, 3); // 主版本号、次版本号glutInitContextProfile(GLUT_CORE_PROFILE);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(500, 500);glutCreateWindow("glDemo");registerListeners(); // 注册监听器// 加载 OpenGL API 指令if (!gladLoadGL()){cout << "Failed to initialize GLAD" << endl;return -1;}glClearColor(0.1f, 0.2f, 0.3f, 1.0f);glutDisplayFunc(drawCallback);glutMainLoop();return 0;
}

3.4 freeglut + GLEW 搭配

​ 项目目录结构如下。

img

​ CMakeLists.txt

# 项目要求的最小CMake版本
cmake_minimum_required(VERSION 3.12)# 声明项目名, 可以通过${PROJECT_NAME}访问, 在顶层CMakeLists.txt中, 也可以通过${CMAKE_PROJECT_NAME}访问
project("glDemo")# 设置C++版本号
set(CMAKE_CXX_STANDARD 17)message("BUILD TYPE: ${CMAKE_BUILD_TYPE}")file(GLOB ASSETS "./thirdParty/bin/freeglut/*")file(COPY ${ASSETS} DESTINATION ${CMAKE_BINARY_DIR})# 头文件目录列表 (便于以该路径为相对路径访问头文件)
include_directories(./thirdParty/include)link_directories(./thirdParty/lib/freeglut./thirdParty/lib/GLEW)# 源文件列表 (相对于当前CMakeLists.txt的路径)
file(GLOB_RECURSE SOURCES"main.cpp")message("source: ${SOURCES}")# 添加可执行目标
add_executable(${CMAKE_PROJECT_NAME} ${SOURCES})# 添加链接的三方库文件
target_link_libraries(${CMAKE_PROJECT_NAME}opengl32glew32s)
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")target_link_libraries(${CMAKE_PROJECT_NAME} freeglutd)
else ()target_link_libraries(${CMAKE_PROJECT_NAME} freeglut)
endif ()

​ main.cpp

#define GLEW_STATIC
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>using namespace std;// 窗口尺寸变化回调函数
void resizeCallback(int width, int height)
{cout << "窗口尺寸变化, " << width << ", " << height << endl;
}// 按键事件回调函数
void keyCallback(unsigned char key, int xpos, int ypos)
{cout << "键盘事件, " << key << ", " << xpos << ", " << ypos << endl;
}// 特殊按键事件回调函数 (功能键、方向键等)
void specialKeyCallback(int key, int xpos, int ypos)
{cout << "特殊键盘事件, " << key << ", " << xpos << ", " << ypos << endl;
}// 鼠标按键回调函数
void mouseButtonCallback(int button, int state, int xpos, int ypos)
{cout << "鼠标按键事件, " << button << ", " << state << ", " << xpos << ", " << ypos << endl;
}// 光标进出窗口回调函数
void cursorEnterCallback(int state)
{cout << "光标进出窗口事件, " << state << endl;
}// 光标移动回调函数
void cursorMoveCallback(int xpos, int ypos)
{cout << "光标移动, " << xpos << ", " << xpos << endl;
}// 光标拖拽回调函数
void cursorDragCallback(int xpos, int ypos)
{cout << "光标拖拽, " << xpos << ", " << ypos << endl;
}// 滚轮滑动回调函数
void scrollCallback(int wheel, int direction, int xpos, int ypos)
{cout << "滚轮事件, " << wheel << ", " << direction << ", " << xpos << ", " << ypos << endl;
}// 关闭窗口回调
void closeCallback()
{cout << "关闭窗口回调" << endl;
}// 渲染回调
void drawCallback()
{glClear(GL_COLOR_BUFFER_BIT);glutSwapBuffers();glutPostRedisplay(); // 请求下一帧(创建循环)
}// 注册监听器
void registerListeners()
{glutReshapeFunc(resizeCallback);glutKeyboardFunc(keyCallback);glutSpecialFunc(specialKeyCallback);glutMouseFunc(mouseButtonCallback);glutEntryFunc(cursorEnterCallback);glutPassiveMotionFunc(cursorMoveCallback);glutMotionFunc(cursorDragCallback);glutMouseWheelFunc(scrollCallback);glutCloseFunc(closeCallback);
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitContextVersion(3, 3); // 主版本号、次版本号glutInitContextProfile(GLUT_CORE_PROFILE);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(500, 500);glutCreateWindow("glDemo");registerListeners(); // 注册监听器// 加载 OpenGL API 指令glewExperimental = GL_TRUE; // 确保GLEW能使用现代OpenGL方法if (glewInit() != GLEW_OK){cout << "Failed to initialize GLEW" << endl;return -1;}glClearColor(0.1f, 0.2f, 0.3f, 1.0f);glutDisplayFunc(drawCallback);glutMainLoop();return 0;
}

​ 声明:本文转自【OpenGL ES】Windows上OpenGL环境搭建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟现实教育终端科技方案——基于EFISH-SCB-RK3588的全场景国产化替代

虚拟现实教育终端科技方案——基于EFISH-SCB-RK3588的全场景国产化替代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

强化学习系统性学习笔记(二):策略优化的理论基础与算法实现

强化学习系统性学习笔记(二):策略优化的理论基础与算法实现策略优化的理论基础与算法实现 3.2 REINFORCE: 最早的策略梯度算法 在完成策略梯度定理的推导后,我们获得了梯度的理论形式: \[\nabla_\theta J(\pi_\thet…

惠州做公司网站广州软件开发培训班

RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接&#xff0c;粘贴下载&#xff1b;解压到文件夹&#xff1b; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具&#xff0c;工具界面击烧写步骤如图所示&#xff1a; 推荐…

完整教程:WordPress 6.5版本带来的新功能

完整教程:WordPress 6.5版本带来的新功能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

网站维护的具体问题wordpress 代理插件

需求&#xff1a;点击button按钮&#xff0c;录入成功后&#xff0c;页面上的input框自动聚焦&#xff0c;快速进行下一次录入&#xff0c;提高效率 开始尝试了几种方法都没有成功 一、首先想到的用vue指令 v-focus&#xff0c;然而没有成功 <Input v-model"book.isbnO…

手机网站判断跳转代码怎么写医院建设网站与托管

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

微信开发框架/WTAPI框架

微信开发框架/WTAPI框架,个人微信接口开发,个微API,个人二次开发微信API,个人微信号二次开发api协议/微信个人号开发API接口 WTAPI框架,是完整的第三方服务平台,并基于IPAD协议8.0.37开发出的最新个微API服务框架…

免费开源Umi-OCR,离线采用,批量精准!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025连接器厂家权威推荐榜:防水/m12防水/m8/防水3芯/防水t型三通/防水线束线缆/防水包胶连接器实力制造与创新技术深度解析

在工业4.0和智能制造快速发展的今天,连接器作为电子设备中不可或缺的基础元件,其技术水平和产品质量直接影响着整个电子系统的可靠性和性能。随着5G通信、新能源汽车、工业自动化等新兴领域的蓬勃发展,全球连接器市…

STM32外部中断(EXTI)以及旋转编码器的简介 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

神经网络中的梯度消失与梯度爆炸 - 实践

神经网络中的梯度消失与梯度爆炸 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

[数学 - 正态分布]

您提到的“中间隆起的图”很可能就是正态分布(Normal Distribution)的图形,也叫钟形曲线(Bell Curve)。 在统计学和金融学中,这个图形和回归分析、标准差一样重要,因为它是我们理解风险、波动性和概率的基础。隆…

Withdraw x Failure《一元微积分》讲义习题

习题 \(1.1\): 第 \(1\) 题: \(1.1.7\):\(\N\) 上的加法是对乘法满足分配律:即对任意 \(m,n,k\in\N\),\((m+n)\cdot k=m\cdot k+n\cdot k\)。 证明:对 \(k\) 做数学归纳。 令 \(A=\{k\in\N|\forall m,n\in \N,(m…

状态压缩 DP

“状态压缩动态规划”中的状态,通常与集合相关联。集合本身具有确定性、互异性和无序性 3 个性质,这也就决定了集合只关心每个元素的存在状态,而这通常可以使用 0 或者 1 表示存在或者不存在。例如,有 8 个物品,对…

QGIS开发笔记(四):QgsRasterLayer加载Cesium二维地图的瓦片地图数据到QGIS

前言地图引擎加载瓦片地图是基本操作,本篇对qgis添加图片瓦片地图。 Demo 专业名词波段波段(Band) 是指栅格数据中具有特定波长范围的信息层,类似于数字图像中的 “通道”。它是栅格数据(尤其是遥感影像)的核心组…

基于 Chrome 浏览器扩展的Chroma简易图形化界面 - 实践

基于 Chrome 浏览器扩展的Chroma简易图形化界面 - 实践2025-10-07 11:28 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; d…

建筑设计作品展示网站wordpress免费相册

在本篇博客中&#xff0c;作者将会讲解类与对象的最后一篇。 一.再谈构造函数 在类与对象&#xff08;上篇&#xff09;中&#xff0c;我们讲到了构造函数&#xff0c;其实构造函数就是给每个成员变量进行赋值&#xff01;&#xff01;&#xff01; 仅仅只是赋值而已&#xf…

苍南县网站集约化建设西安网站优化排名案例

原文 http://www.eoeandroid.com/thread-274556-1-1.html 【初识Github】 首先让我们大家一起喊一句“Hello Github”。YEAH!就是这样。Git是一个分布式的版本控制系统&#xff0c;最初由Linus Torvalds编写&#xff0c;用作Linux内核代码的管理。在推出后&#xff0c;Git在其…

详细介绍:go语言学习 第4章:流程控制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

学号20232328 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1.1NOP, JNE, JE, JMP, CMP汇编指令的机器码: 1.1.1NOP(No Operation) 功能:NOP指令是一条空操作指令,它不做任何事情。执行NOP指令时,处理器的状态(如寄存器值、内存内容等)不会发生变化,只是简单…