【小沐学OpenGL】Ubuntu环境下glew的安装和使用

news2024/9/22 13:43:45

文章目录

  • 1、简介
    • 1.1 OpenGL简介
    • 1.2 glew简介
  • 2、安装glew
    • 2.1 命令安装glew
    • 2.2 直接代码安装glew
    • 2.3 cmake代码安装glew
  • 3、测试glew
    • 3.1 测试glew+freeglut
    • 3.2 测试glew+glfw
  • 结语

1、简介

1.1 OpenGL简介

Linux 系统中的 OpenGL 是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D和3D矢量图形。

这里显示 OpenGL 的版本信息:

glxinfo| grep version

在这里插入图片描述

glxinfo:这是一个用于查询关于 OpenGL 图形系统的信息的命令行工具。它提供了关于图形硬件、驱动程序以及支持的 OpenGL 扩展的详细信息。
grep:这是一个文本搜索工具,用于搜索文本文件或输出中匹配特定模式的行。在这里,它用于搜索包含“version”这个词的行。

glxinfo没有安装,执行如下命令进行安装:

sudo apt install mesa-utils

在这里插入图片描述
安装成功,继续上面的glxinfo命令如下:
在这里插入图片描述
使用 glxgears 命令来测试 OpenGL 的性能,它是一个简单的 OpenGL 程序,显示旋转的齿轮,可以用来测试图形硬件的渲染能力。

glxgears 

在这里插入图片描述
eglinfo:类似于 glxinfo,但是用于查询有关 EGL (嵌入式系统图形接口) 的信息。

eglinfo

在这里插入图片描述

1.2 glew简介

GLEW(OpenGL Extension Wrangler Library)是一个跨平台的开源 C/C++ 扩展加载库,用于确定目标平台支持哪些 OpenGL 扩展。它提供了高效的运行时机制,并且已经过多种操作系统的测试,包括 Windows、Linux、Mac OS X、FreeBSD、Irix 和 Solaris。GLEW 使得 OpenGL 核心和扩展功能的声明都包含在单个头文件中,简化了 OpenGL 扩展的使用。
在这里插入图片描述
输入glew官方网址:

https://glew.sourceforge.net/

在这里插入图片描述

2、安装glew

2.1 命令安装glew

sudo apt-cache search glew

在这里插入图片描述

# sudo apt-get install libglew-dbg libglew-dev libglew1.13 libglewmx-dbg libglewmx-dev libglewmx1.13 glew-utils
sudo apt-get -y install glew-utils

在这里插入图片描述
在 Linux 系统中安装 GLEW 可以通过包管理器进行。例如,在基于 Debian 的系统(如 Ubuntu)中,可以使用以下命令安装 GLEW:

# sudo apt install libglew2.1 libglew-dev
sudo apt-get install libglew-dev
# /usr/lib/x86_64-linux-gnu/libGLEW.so

在这里插入图片描述
这将安装 GLEW 的开发文件,包括库文件和头文件。安装后,你可以在项目中包含 GLEW 头文件,并链接到 GLEW 库以使用 OpenGL 扩展。

如果通过cmake编译,在CMakeLists.txt添加如下代码:

find_package(GLEW REQUIRED)

target_link_libraries(untitled1 GLEW::GLEW)
  • 完整的CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)

project(untitled1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(GLEW REQUIRED)

add_executable(untitled1
  main.cpp
)
target_link_libraries(untitled1 GLEW::GLEW)

include(GNUInstallDirs)
install(TARGETS untitled1
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
  • main.cpp:
#include <GL/glew.h>
#include <iostream>

int main(int argc, char *argv[])
{
    std::cout << "hello yxy" << std::endl;

    // 初始化 GLEW
    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
        std::cout << "glew init failed." << std::endl;
    }
    else {
        std::cout << "glew init ok." << std::endl;
    }

    return 0;
}

编译测试项目代码如下:
在这里插入图片描述
再给一个glew测试的例子:

  • main.cpp:
#include <GL/glew.h>

#include <stdio.h>
#include <stdlib.h>

#define S(x) SS(x)
#define SS(x) #x

int main(int argc, char* argv[]) {
    printf("GLEW CMake test, %s build\n",
           S(GLEW_CMAKE_TEST_CONFIG));
    printf("-- linked to %s which is %s\n",
           S(GLEW_CMAKE_TEST_TARGET_FILE_NAME),
           S(GLEW_CMAKE_TEST_TARGET_TYPE));
    const GLubyte* v = glewGetString(GLEW_VERSION);
    if(v) {
        printf("-- glewGetString(GLEW_VERSION) returns %s\n-- test passed.\n", v);
        return EXIT_SUCCESS;
    } else {
        printf("-- glewGetString(GLEW_VERSION) returns NULL\n-- test failed.\n");
        return EXIT_FAILURE;
    }
}

在这里插入图片描述

卸载libglew-dev库后运行如下:

sudo apt autoremove libglew-dev

在这里插入图片描述
再编译上面的测试项目代码如下:
在这里插入图片描述

2.2 直接代码安装glew

https://glew.sourceforge.net/

如果你需要从源代码编译 GLEW,可以访问 GLEW 的官方网站或其 GitHub 仓库获取源代码。编译 GLEW 通常需要安装一些构建工具,如 make、gcc、git 等。在 Linux 系统上,可以使用以下命令安装这些工具:

sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev

GLEW(OpenGL Extension Wrangler)的官方网站是 http://glew.sourceforge.net/,可以在这个网站上下载GLEW的源代码并进行安装。
wget下载源码如下:

wget https://jaist.dl.sourceforge.net/project/glew/glew/2.1.0/glew-2.1.0.tgz

在这里插入图片描述
或者使用curl命令下载:

curl https://jaist.dl.sourceforge.net/project/glew/glew/2.1.0/glew-2.1.0.tgz -o glew-2.1.0.tgz

在这里插入图片描述

执行如下命令进行解压和编译。

tar -zxvf glew-2.1.0.tgz
cd glew-2.1.0
#cmake ../cmake -DCMAKE_INSTALL_PREFIX=./install
make
sudo make install

解压glew-2.1.0.tgz如下:
在这里插入图片描述

通过make编译源代码如下:
在这里插入图片描述
安装编译后文件到系统目录:

sudo make install
make clean

在这里插入图片描述
查看一下本机上glew被安装的文件夹:

find / -name libGLEW.so

在这里插入图片描述
使用如下代码,静态链接到特定位置的自定义编译 GLEW 库:

#GLEW libraries
add_library(glew_static STATIC IMPORTED)
# add_library(glew_static SHARED IMPORTED)

set_target_properties(glew_static PROPERTIES
    IMPORTED_LOCATION /usr/lib64/libGLEW.a)
    
target_link_libraries(testglew glew_static)

也可以将它与共享库一起使用,只需从 add_library 中删除 STATIC 关键字。
如果通过cmake编译,在CMakeLists.txt添加如下代码:

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.16)

project(untitled1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#####################
# glew
add_library(glew_static STATIC IMPORTED)
set_target_properties(glew_static PROPERTIES
    IMPORTED_LOCATION /usr/lib64/libGLEW.a)

#####################
# opengl
find_package(OpenGL REQUIRED)

add_executable(untitled1
  main.cpp
)
target_link_libraries(untitled1 glew_static OpenGL::GL)

include(GNUInstallDirs)
install(TARGETS untitled1
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
  • main.cpp
#include <GL/glew.h>
#include <iostream>

int main(int argc, char *argv[])
{
    std::cout << "hello yxy" << std::endl;

    // 初始化 GLEW
    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
        std::cout << "glew init failed." << std::endl;
    }
    else {
        std::cout << "glew init ok." << std::endl;
    }

    return 0;
}

编译测试项目如下:
在这里插入图片描述

2.3 cmake代码安装glew

tar -zxvf glew-2.1.0.tgz
cd glew-2.1.0
cd build
mkdir linux
cd linux
cmake ../cmake -DCMAKE_INSTALL_PREFIX=./install
# cmake ../cmake -DCMAKE_INSTALL_PREFIX=/usr/local/thirdparty 
make
make install

在这里插入图片描述
执行make install后安装到当前文件夹的install子文件夹里:
在这里插入图片描述

3、测试glew

3.1 测试glew+freeglut

  • CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)

project(testglew LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#####################
# glew
find_package(GLEW REQUIRED)

#####################
# glut
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLUT_INCLUDE_DIRS})

add_executable(testglew
  main.cpp
)
target_link_libraries(testglew 
    GLEW::GLEW
    ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES}
)

include(GNUInstallDirs)
install(TARGETS testglew
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
  • main.cpp
#include <iostream>
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
#include <GL/glut.h>

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 200.0, 0.0, 160.0);
}

void lineSegment(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_LINES);
    glVertex2i (180, 15);
    glVertex2i (10, 145);
    glEnd();
    glFlush();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(400, 300);
    glutCreateWindow("Example OpenGL Program");

    // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
    glewExperimental = GL_TRUE;
    // Initialize GLEW to setup the OpenGL Function pointers
    if(glewInit() != GLEW_OK) {
         std::cout << "Failed to initialize GLEW" << std::endl;
         return -1;
    }
    else {
         std::cout << "GLEW is ok!" << std::endl;
    }

    init();
    glutDisplayFunc(lineSegment);
    glutMainLoop();
    return 0;
}

在这里插入图片描述

3.2 测试glew+glfw

  • CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)

project(untitled1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#####################
# glfw
find_package(glfw3 REQUIRED)

#####################
# glew
add_library(glew_static STATIC IMPORTED)
set_target_properties(glew_static PROPERTIES
    IMPORTED_LOCATION /usr/lib64/libGLEW.a)

#####################
# opengl
find_package(OpenGL REQUIRED)

add_executable(untitled1
  main.cpp
)
target_link_libraries(untitled1 glew_static OpenGL::GL glfw)

include(GNUInstallDirs)
install(TARGETS untitled1
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
  • main.cpp
#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 300;

// 顶点着色器,GLSL语言
const char *vertexShaderSource = "#version 330 core\n"
                                 "layout (location = 0) in vec3 aPos;\n"
                                 "void main()\n"
                                 "{\n"
                                 "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
                                 "}\0";
// 片元着色器
const char *fragmentShaderSource = "#version 330 core\n"
                                   "out vec4 FragColor;\n"
                                   "void main()\n"
                                   "{\n"
                                   "   FragColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);\n"
                                   "}\n\0";

int main()
{
    // glfw: initialize and configure
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif

    // glfw window creation
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Ubuntu Opengl, yxy", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    // glad: load all OpenGL function pointers
    // if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    // {
    //     std::cout << "Failed to initialize GLAD" << std::endl;
    //     return -1;
    // }
    if(glewInit() != GLEW_OK) {
        std::cout << "Failed to initialize GLEW" << std::endl;
        return -1;
    }

    // build and compile our shader program
    // ------------------------------------
    // vertex shader
    int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
    // check for shader compile errors
    int success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    // fragment shader
    int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
    // check for shader compile errors
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    // link shaders
    int shaderProgram = glCreateProgram(); // shaderProgram 是多个着色器合并之后并最终链接完成的版本
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    // check for linking errors
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success) {
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);


    float vertices[] = {
        -0.5f, -0.5f, 0.0f, // left
        0.5f, -0.5f, 0.0f, // right
        0.0f,  0.5f, 0.0f  // top
    };

    unsigned int VBO, VAO;
    //创建VAO对象
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    //创建VBO对象,把顶点数组复制到一个顶点缓冲中,供OpenGL使用
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO); // 缓冲绑定到GL_ARRAY_BUFFER
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 顶点数据复制到缓冲的内存中

    //解释顶点数据方式
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); // 顶点数据的解释
    glEnableVertexAttribArray(0);

    // 解绑VAO
    glBindVertexArray(0);
    // 解绑VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    // render loop
    while (!glfwWindowShouldClose(window))
    {
        // input
        processInput(window);

        // render
        glClearColor(1.0f, 0.7f, 0.7f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // draw our first triangle
        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // optional: de-allocate all resources
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glDeleteProgram(shaderProgram);
    glfwTerminate();

    return 0;
}

//键盘按键回调函数
void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

//调整窗口大小回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

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

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

相关文章

智能的PHP开发工具PhpStorm v2024.2全新发布——支持日志文件

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…

【私活儿分享】手串珠子管理小程序,便捷查询珠子(串手链的珠子)位置

前言 之间帮客户做了个查询手串珠子位置的小程序&#xff0c;便于帮助客户管理众多的珠子&#xff0c;这个珠子就是戴在手上串起来的饰品。好了&#xff0c;话不多说&#xff0c;进入正题&#xff01; 正文 小程序比较简单&#xff0c;采用云开发。两个页面&#xff0c;一个查…

Git 新手指南

Git 命令大全 Git 是目前最流行的分布式版本控制系统&#xff0c;用于跟踪文件的更改&#xff0c;协调不同开发者的协作。掌握 Git 命令能够极大提高工作效率&#xff0c;尤其在软件开发过程中。本文将详细介绍 Git 的一些常用命令&#xff0c;帮助你更好地理解和使用 Git。 1…

一款免费开源的截图软件,SETUNA截图软件

SETUNA是一款功能强大且便捷的屏幕截图工具&#xff0c;适用于多种场景&#xff0c;包括日常办公、学习和游戏娱乐等。该软件的主要特点如下&#xff1a; 高效截图&#xff1a;用户可以轻松截取屏幕上的任何部分&#xff0c;并且支持自定义选取截图范围。图片编辑功能&#xf…

聊聊go语言channel中的一些小技巧

写在文章开头 go语言提供了各种非常方便的语法糖&#xff0c;使得我们实现用最少的语法做尽可能高效的事情&#xff0c;而本文就简单介绍如何实现非阻塞处理多个channel&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的技…

项目进度一

一.双token验证登陆/注册 1.在前端中&#xff0c;得到响应记录acessToken和 refreshToken ,并记录在 localStorage中&#xff0c;当登录之后的请求都要携带着accessToken,如果accessToken过期&#xff0c;就再验证一下refreshToken&#xff0c;如果也过期就需要重新登录&#…

亚马逊测评自养号卖家如何以低成本提高店铺产品曝光率和销量?

在跨境电商领域&#xff0c;随着市场日趋饱和和竞争加剧&#xff0c;卖家普遍面临流量低、转化率低的共同挑战。为了在这种严重的“内卷化”环境中脱颖而出&#xff0c;不少卖家投入了大量的资金和资源&#xff0c;尝试了各种站内和站外的推广方式&#xff0c;但往往因为缺乏成…

Vue2中使用ant-design的tab组件让他一行充满

使用tabs组件默认样式这样 想改成水平居中铺满如下&#xff1a; 需要改下css样式 /deep/ .ant-tabs-nav {width: 100%;& > div {width: 100%;display: flex;align-items: center;}.ant-tabs-tab {flex: 1;text-align: center;}}

Python中matplotlib-legend图例水平排列

在matplotlib中&#xff0c;图例是用来标识不同数据系列或不同类别的标记和颜色的标签。有时候我们希望将图例水平排列&#xff0c;以节省空间并使得图例更加美观。本文将介绍如何在matplotlib中实现图例的水平排列。 方法一&#xff1a;使用legend的loc参数 我们可以通过leg…

Android通知(Notification)的基本用法

Android通知&#xff08;Notification&#xff09;的基本用法 通知&#xff08;Notification&#xff09;是Android系统中比较有特色的一个功能&#xff0c;当某个应用程序希望向用户发出一些提示信息&#xff0c;而该应用程序又不在前台运行时&#xff0c;就可以借助通知来实…

云计算实训43——部署k8s基础环境、配置内核模块、基本组件安装

一、K8S基本概念 1、k8s是什么 K8S是Kubernetes的 缩写&#xff0c;由于k 和 s 之间有⼋个字符&#xff0c;所以因此得名。 Kubernetes 是⼀个可移植的、可扩展的开源平台&#xff0c;⽤于管理容器化 的⼯作负载和服务&#xff0c;可促进声 明式配置和⾃动化。 2、k8s的功…

pico 手臂手部手指完整版

别忘了设置好pico的设置和导入需要的样式 一、动画设置 1.1设置Avatar 遮罩; 1.2创建动画、手指动画的话&#xff0c;我创建了四个&#xff0c;分别对应的是&#xff08;平展、弯曲食指、弯曲其他手指、握拳&#xff09; 1.3建立分层、我建了三层&#xff0c;默认层&#xff…

第二十章 加密 SOAP 主体

文章目录 第二十章 加密 SOAP 主体加密概述加密 SOAP 主体 第二十章 加密 SOAP 主体 本主题介绍如何加密 IRIS Web 服务和 Web 客户端发送的 SOAP 消息正文。 主题“加密安全标头元素”和“使用派生密钥令牌进行加密和签名”描述了如何加密安全标头元素以及加密 SOAP 主体的其…

这10个提示词技巧太强了,用过的人都说真香!

ChatGPT 已经发布一年多了&#xff0c;这一年&#xff0c;我们经常会听到“提示词工程&#xff08;Prompt Engineering&#xff09;”这个术语&#x1f4bb; 在探讨这个概念之前&#xff0c;我们需要先了解什么是Prompt&#xff08;提示词&#xff09;&#x1f914; 简单来说…

面试题复习(0902-0909)

1. 完全背包问题 和01背包唯一的区别是&#xff0c;每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09; 代码和01唯一的区别在于j的循环是从小到大&#xff0c;不是从大到小。ij谁在外谁在内层区别不大。 #include <bits/stdc.h> using namespace std…

Linux(2)--VmWare虚拟机安装

文章目录 1. VmWare概念2. 安装步骤2.1 下载2.2 安装过程 3. 小结 1. VmWare概念 现在我们要学习Linux了&#xff0c;需要有一台安装Linux系统的计算机。 但是我们又不想放弃Windows&#xff0c;毕竟平时办公、娱乐还得用。 此时可以在电脑上安装VmWare虚拟机软件&#xff0…

C:9-9题目:蛇形矩阵

一、题目介绍&#xff1a; 给你两个整数n&#xff0c;m&#xff0c;请你构造一个n行m列的蛇形方阵&#xff0c;在这个方阵中&#xff0c;数字由1到nm&#xff0c;从最右上角开始&#xff0c;呈环状(逆时针)向内填充。 比如一个3*3的蛇形方阵 3 2 1 4 9 8 5 6 7 二、解题思路&a…

Dropout正则化:提升PyTorch模型性能的神器!

本文展示了在PyTorch模型中添加Dropout正则化如何影响模型在损失和准确率方面的性能。 Dropout正则化在机器学习中的意义是什么&#xff1f; Dropout正则化是机器学习中的一种方法&#xff0c;通过在神经网络中随机丢弃一些单元&#xff08;神经元&#xff09;来模拟同时训练多…

explicit 的作用(如何避免编译器进行隐式类型转换)

目录 1. 隐式转换&#xff08;Implicit Conversion&#xff09; 2. 显式转换&#xff08;Explicit Conversion&#xff09; 3. 隐式转换的风险与显式转换的必要性 4. 隐式类型转换的例子 5. explicit 的作用 6. explicit 在构造函数中的作用 7. explicit 适用于转换操作…

常见网络层(卷积、池化、全连接)与其计算

卷积可视化&#xff1a;卷积神经网络 (CNN) 基本原理和公式_cnn公式-CSDN博客 嵌入大小计算规则【注意评论区全连接层计算规则勘误&#xff1a;Pv Wv Bv】 Conv、MaxPool、FC 池化操作和conv在kernels上计算不一致&#xff0c;在图像尺寸上的规则都是一样的。 公式可以理解…