当前位置: 首页 > news >正文

CMake简单使用(二)

目录

  • 五、scope 作用域
    • 5.1 作用域的类型
      • 5.1.1 全局作用域
      • 5.1.2 目录作用域
      • 5.1.3 函数作用域
  • 六、宏
    • 6.1 基本语法
    • 6.2 演示代码
  • 七、CMake构建项目
    • 7.1 全局变量
    • 7.2 写入源码路径
    • 7.3 调用子目录cmake脚本
    • 7.4 CMakeLists 嵌套(最常用)
  • 八、CMake 与库
    • 8.1 CMake生成动静态库
      • 8.1.1 动静态库
      • 8.1.2 常见命令
      • 8.1.3 生成静态库
        • 8.1.3.1 示例
        • 8.1.3.2 总结
      • 8.1.4 生成动态库
    • 8.2 CMake调用动静态库
    • 8.2.1 静态库调用流程:
    • 8.2.2 动态库调用流程:

五、scope 作用域

5.1 作用域的类型

5.1.1 全局作用域

  • 从CMake脚本开始运行到结束。
  • 所有CMakeLists.txt文件共享全局作用域
  • 通过set()定义的变量默认是全局变量(除非明确在函数或宏中设置为局部变量)
set(GLOBAL_VAR "I am global")
message(${GLOBAL_VAR}) # 输出: I am global

5.1.2 目录作用域

  • 每个目录中的CMakeLists.txt文件有独立的作用域
  • 子目录可以继承父目录的变量,但子目录中对变量的更改不会影响父目录,只在子目录下生效
    下面是一个demo,理解即可,暂时不尝试自己编译:
# 顶层 CMakeLists.txt
set(DIR_VAR "Parent Directory")
# 添加子目录
add_subdirectory(subdir)
# 子目录 subdir/CMakeLists.txt
message(${DIR_VAR}) # 输出: Parent Directory
set(DIR_VAR "Child Directory")

子目录进行set操作后,顶层的 DIR_VAR 不会被子目录的更改影响。

5.1.3 函数作用域

  • 在函数中定义的变量是局部变量,只在函数内有效
  • 使用set()定义变量时,作用域局限于当前函数,除非指定PARENT_SCOPE
function(set_local_var)set(LOCAL_VAR "Local Scope")message(${LOCAL_VAR}) # 输出: Local Scope
endfunction()set_local_var()
message(${LOCAL_VAR}) # 输出: (空,因为超出函数作用域)

六、宏

6.1 基本语法

macro(<name> [arg1 [arg2 ...]])# 宏体
endmacro()
  • <name> 是宏的名称。
  • [arg1, arg2…] 是参数列表(可选)。
  • 宏没有返回值,但可以通过变量或 CACHE 修改全局状态。

6.2 演示代码

cmake_minimum_required(VERSION 3.20.0)macro(Test myVar)set(myVar "new value")message ("2. argument: ${myVar}")
endmacro()set(myVar "First value")
message ("1. myVar: ${myVar}")
Test("value")
message("3. myVar: ${myVar}")

在这里插入图片描述
在这里插入图片描述

七、CMake构建项目

7.1 全局变量

在[[#1.2 初体验]]中,我们使用了以下代码:

project(hello CXX)
  • 声明项目名称为 hello,并设置主要语言为 C++(CXX)。
  • 生成项目相关的全局变量,例如:
    • ${PROJECT_NAME}:值为 hello
    • ${PROJECT_SOURCE_DIR}:项目的根目录路径。
    • ${PROJECT_BINARY_DIR}:构建目录路径。

7.2 写入源码路径

特点

  • 最简单的构建方式。
  • 适用于只有一个 CMakeLists.txt 文件的小型项目。
    目录结构
MyProject/
├── CMakeLists.txt
├── main.cpp
├──Transportation├──train.h├──tarin.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.20.0)project(MyProject CXX)
add_executable(MyProject main.cpp 需要链接的文件路径)
  • CXX 表示语言是 cpp
  • 在原文件中,要写对应的.h文件,main.cpp:#include "Transportation/train.h",在这里就不需要再包含,但是要包含.cpp文件的路径
    构建方法
cmake -B build
cmake --build build
build/项目名称

![[IMG-20241212140631676.png]]

7.3 调用子目录cmake脚本

  • include方法可以引入子目录中的cmake后缀的配置文件
  • 将配置加入 add_executable
    目录结构:
.
├── CMakeLists.txt
├── main.cpp
└── Transportation├── car.cpp├── car.h├── train.cpp├── train.h└── transportation.cmake

transportation.cmake使用set将变量设置成需要链接的文件:

set(trans_sources Transportation/car.cpp Transportation/train.cpp)

然后在CMakeLists.txt中就可以直接使用该变量:

cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)
include(Transportation/transportation.cmake)
add_executable(MyProject main.cpp ${trans_sources})

❗️注意:要使用include引入子目录下的cmake文件,使用变量要用${}
构建方法同上。

7.4 CMakeLists 嵌套(最常用)

  • target_include_directories 头文件目录的声明
  • target_link_libraries 连接库文件
  • add_subdirectory 添加子目录
  • add_ library 生成库文件(默认静态库)
    目录结构:
.
├── CMakeLists.txt
├── main.cpp
└── Transportation├── car.cpp├── car.h├── CMakeLists.txt├── train.cpp└── train.h

在子目录的CMakeLists.txt中,add_library 命令创建一个名为 Translib 的库,该库包含 train.cpp 和 car.cpp 两个源文件的编译结果。

add_library(Translib train.cpp car.cpp)

在父目录的CMakeLists.txt中,

cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)add_subdirectory(Transportation)add_executable(MyApp main.cpp)target_link_libraries(MyApp PUBLIC Translib)target_include_directories(MyApp PUBLIC "${PROJECT_SOURCE_DIR}/Transportation")
  1. 定义项目
  • project(MyProject CXX) 声明项目的名称为 MyProject,并设置其主要语言为 C++。
  1. 添加子目录
  • add_subdirectory(Transportation) 将 Transportation 子目录的构建逻辑纳入父目录中。
  • 这会递归执行 Transportation 目录中的 CMakeLists.txt,构建 Translib 库。
  1. 添加可执行文件
  • add_executable(MyApp main.cpp) 声明一个名为 MyApp 的可执行目标,其源文件为 main.cpp。
  1. 链接库
  • target_link_libraries(MyApp PUBLIC Translib) 将 Translib 库链接到可执行文件 MyApp。
  • PUBLIC:表示 Translib 的头文件路径和链接库信息都对 MyProject 和其使用者可见。
  1. 包含头文件路径
  • target_include_directories(MyApp PUBLIC "${PROJECT_SOURCE_DIR}/Transportation") 明确告诉 CMake,MyProject 需要包含 Transportation 目录中的头文件(如 car.h 和 train.h),这样在main.cpp中包含头文件时就不需要再次包含路径。
    构建顺序总结
  1. 进入父目录的构建流程
  • cmake 检测到 add_subdirectory(Transportation),递归构建子目录。
  • 子目录生成 Translib 库。
  1. 构建父目录目标
  • 构建 main.cpp 并将其链接到已生成的 Translib。

八、CMake 与库

8.1 CMake生成动静态库

8.1.1 动静态库

静态库
常见命名:.a(Linux/Unix),.lib(Windows)。

在链接阶段,将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。
对函数库的链接是编译器的链接器在编译阶段完成静态链接的过程

动态库
常见命名:.so(Linux/Unix),.dll(Windows),.dylib(macOS

动态库是在程序运行时才会被载入到内存,当执行到库中代码时就会跳转到目标库。
动态库需要依赖操作系统的动态链接机制

8.1.2 常见命令

  • file(GLOB ...) 常用于搜索源文件
  • add_library(animal STATIC ${SRC}) 生成静态库
  • add_library(animal SHARED ${SRC}) 生成动态库
  • ${LIBRARY_OUTER_PATH} 导出目录

8.1.3 生成静态库

8.1.3.1 示例

当前目录结构如下:

.
├── CMakeLists.txt
├── include
│   ├── car.h
│   └── train.h
└── src├── car.cpp└── train.cpp

CMakeLists.txt:

cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)file(GLOB SRC &${PROJECT_SOURCE_DIR}/src/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/a)
add_library(trans STATIC ${SRC})

下面来解释一下上面的代码:

project(MyProject CXX)

在[[#7.1 全局变量]]中,我们了解到使用project时,除声明项目名称外,还会生成项目相关的全局变量,例如:

  • ${PROJECT_NAME}:值为 MyProject。
  • ${PROJECT_SOURCE_DIR}:项目的根目录路径。
  • ${PROJECT_BINARY_DIR}:构建目录路径。

file(GLOB SRC ${PROJECT_SOURCE_DIR}/src/*.cpp)

作用

  • 使用 file(GLOB ...) 命令,搜索 src 目录下所有以 .cpp 结尾的文件,并将它们的路径存入变量 SRC
  • GLOB 是 CMake 提供的文件搜索命令,用于匹配文件路径。
  • 示例:如果 src 目录下有 car.cpp 和 train.cpp,那么 SRC 的值将是:
/path/to/src/car.cpp
/path/to/src/train.cpp

include_directories(${PROJECT_SOURCE_DIR}/include) 

作用

  • 将 include 目录(即 car.h 和 train.h 所在目录)添加到项目的头文件搜索路径中。
  • 等效于将 -I/path/to/include 传递给编译器。
  • 这样,源文件中可以直接使用,而无需写完整路径:
#include "car.h"
#include "train.h"

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/a)

作用

  • 指定生成的库文件的输出目录为项目根目录下的 a 子目录。
  • 如果没有这一行,CMake 默认将库文件输出到构建目录中。

add_library(trans STATIC ${SRC})

作用

  • 定义一个名为 trans 的静态库(STATIC)。
  • SRC 中列出的源文件(如 car.cpp 和 train.cpp)将被编译,并打包成静态库。
8.1.3.2 总结

生成静态库的基本步骤:

# 1. 设置 CMake 最低版本
cmake_minimum_required(VERSION 3.20)
# 2. 定义项目名称和语言
project(MyStaticLibrary LANGUAGES CXX)# 3. 添加头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 4. 查找源文件
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)# 5. 设置库文件的输出路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/a)# 6. 添加静态库 声明一个静态库目标(STATIC 表示静态库),指定构成静态库的源文件。
add_library(MyStaticLib STATIC ${SRC_FILES})

8.1.4 生成动态库

生成动态库与生成静态库的步骤类似,只需要将添加静态库的STATIC改为SHARED(动态库也叫共享库)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/so)
add_library(trans SHARED ${SRC})

8.2 CMake调用动静态库

8.2.1 静态库调用流程:

  1. 指定静态库的路径
  2. 添加可执行文件
  3. 链接静态库
  4. 添加库的头文件路径
    假设当前目录如下:
flash@VM-12-10-ubuntu:~/2024/12/14_cmake/useLib$ tree -L 2
.
├── CMakeLists.txt
├── include
│   ├── car.h
│   └── train.h
├── Lib
│   ├── libtrans.a
│   └── libtrans.so
└── main.cpp

如果已经生成了动静态库,可以直接删除src目录,但是建议保留include目录,下面来看CMakeLists.txt的具体编写:

cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)# 指定静态库的路径
set(STATIC_LIB_PATH ${PROJECT_SOURCE_DIR}/Lib/libtrans.a)
# 添加可执行文件
add_executable(MyExecutable main.cpp)
# 链接静态库(仅作用于 MyExecutable)
target_link_libraries(MyExecutable PRIVATE ${STATIC_LIB_PATH})
# 添加库的头文件路径(仅作用于 MyExecutable)
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)

8.2.2 动态库调用流程:

  1. 指定动态库的路径
  2. 添加可执行文件
  3. 链接静态库
  4. 添加库的头文件路径
cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)# 指定动态库的路径
set(DYNAMIC_LIB_PATH ${PROJECT_SOURCE_DIR}/Lib/libtrans.so)
# 添加可执行文件
add_executable(MyExecutable main.cpp)
# 链接动态库(仅作用于 MyExecutable)
target_link_libraries(MyExecutable PRIVATE ${DYNAMIC_LIB_PATH})
# 添加库的头文件路径(仅作用于 MyExecutable)
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)

相关文章:

CMake简单使用(二)

目录 五、scope 作用域5.1 作用域的类型5.1.1 全局作用域5.1.2 目录作用域5.1.3 函数作用域 六、宏6.1 基本语法6.2 演示代码 七、CMake构建项目7.1 全局变量7.2 写入源码路径7.3 调用子目录cmake脚本7.4 CMakeLists 嵌套(最常用) 八、CMake 与库8.1 CMake生成动静态库8.1.1 动…...

React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法

React 在 React 中&#xff0c;forwardRef 是一种高级技术&#xff0c;它允许你将 ref 从父组件传递到子组件&#xff0c;从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件&#xf…...

MATLAB 识别色块和数量

文章目录 前言步骤 1: 读取图像步骤 2: 转换为 HSV 颜色空间步骤 3: 定义颜色范围步骤 4: 创建颜色掩码步骤 5: 应用形态学操作&#xff08;可选&#xff09;步骤 6: 标记和显示结果完整代码步骤七 返回色块坐标 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&…...

.NET 9 已发布,您可以这样升级或更新

.NET 9 已经发布&#xff0c;您可能正在考虑更新您的 ASP.NET Core 应用程序。 我们将介绍更新应用程序所需的内容。从更新 Visual Studio 和下载 .NET SDK 到找出可能破坏应用程序的任何重大更改。 下载 .NET 9 SDK 这些是下载 .NET 9 SDK 所需的步骤。 更新 Visual Studi…...

VMware ubuntu16.04怎么设置静态IP联网

1.将VMware桥接到当前电脑使用的网络上面&#xff1b; 2.点击网络符号&#xff0c;编辑连接&#xff1b; 3.双击有线连接1&#xff1b; 4.选择IPv4设置&#xff0c;将地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS服务器设置好&#xff0c;保存&#xff1b; 5.在终…...

#渗透测试#漏洞挖掘#红蓝攻防#js分析(上)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

.NET 6.0 中接入 Log4net 和 NLog

一、接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文件内容为 <?xml version"1.0" encoding"utf-8"?> <log4net> <!-- Define some output appe…...

linux从frame buffer中将qt界面拷贝出来放到u盘的操作方法

使用的是gsnap工具&#xff0c;源码可以在百度上搜,以Imx6为例的使用方法 rootimx6qsabresd:~# rootimx6qsabresd:~# rootimx6qsabresd:~# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 289293 197510 76423 73% / devtmpfs …...

最新全开源IM即时通讯系统源码(PC+WEB+IOS+Android)部署指南

全开源IM&#xff08;即时通讯&#xff09;系统源码部署是一个复杂但系统的过程&#xff0c;涉及多个组件和步骤。以下是一个详细的部署指南&#xff0c;旨在帮助开发者或系统管理员成功部署一个全开源的IM系统&#xff0c;如OpenIM。      IM即时通讯系统源码准备工作   …...

使用Linux的logrotate工具切割日志:Tomcat、NGINX(journal文件清理)

文章目录 引言I Tomcat日志切割配置轮转参数验证码II NGINX访问文件的配置和切割access.log 访问日志的配置使用Linux的logrotate工具切割日志验证文件切割III /run/log/journaljournalctl文件清理引言 journal文件清理: 只保留过去两天,清理之前的文件 journalctl --vacuu…...

shell脚本1

运行脚本 1、先创建一个sh脚本文件,里面输入一个输出网站的命令&#xff0c;比如echo www.baidu.com vim 1.sh2、可以利用以下三种方式、这三种其实不管哪种脚本解释器最后调用的还是这个dash,下面是解释为什么调用都是dash&#xff0c;我们ls可以发现最后目录都是指向了dash…...

Qt-chart 画折线图(以时间为x轴)

上图 代码 #include <iostream> #include <random> #include <qcategoryaxis.h>void MainWindow::testLine() {//1、创建图表视图QChartView* view new QChartView(this);//2.创建图表QChart* chart new QChart();//3.将图表设置给图表视图view->setCh…...

【kubernetes】kubectl get nodes报NotReady

目录 1. 说明2. 问题描述3. kube-flannel.yml 1. 说明 1.这里k8s的版本是v1.17.4。2.若kube-flannel.yml中的镜像拉取不下来&#xff0c;可以下载本文章的文件资源&#xff0c;手动docker load -i ***.tar的方式。3.v1.17.4的kube-flannel.yml参考下面代码。4.通过kubectl get…...

分布式开发学习

1、kratos的特点 gRPC&#xff1a;Kratos 默认支持 gRPC&#xff0c;提供高性能的远程调用能力&#xff0c;适用于微服务间通信。 HTTP &#xff1a;同时支持 HTTP/1.1 和 HTTP/2&#xff0c;方便微服务与外部系统交互。 Protocol Buffers&#xff1a; protoc 工具生…...

软件测试的几种方法详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、从是否关心内部结构来看 (1)白盒测试&#xff1a;又称为结构测试或逻辑驱动测试&#xff0c;是一种按照程序内部逻辑结构和编码结构&#xff0c;设计测试数据并…...

C语言---int r 与 int r=数的区别

int r 在这里面声明了一个变量r&#xff0c;创建了内存空间 int r 2 声明了一个整数类型的变量r&#xff0c;并给它赋值&#xff08;初始值&#xff09;为2&#xff0c;创建内存空间并赋值。...

matlab测试ADC动态性能的原理

目录 摘要&#xff1a; 简介&#xff1a; 动态规范和定义 动态规格&#xff1a; 双面到单边的功率谱转换 摘要&#xff1a; 模数转换器&#xff08;adc&#xff09;代表了接收器、测试设备和其他电子设备中的模拟世界和数字世界之间的联系。正如本文系列的第1部分中所概述…...

XDOJ 877 图的深度优先遍历

题目&#xff1a;图的深度优先遍历 问题描述 已知无向图的邻接矩阵&#xff0c;以该矩阵为基础&#xff0c;给出深度优先搜索遍历序列&#xff0c;并且给出该无向图的连通分量的个数。在遍历时&#xff0c;当有多个点可选时&#xff0c;优先选择编号小的顶点。&#xff08;即…...

内网穿透讲解

什么是内网穿透 内网穿透是一种网络技术&#xff0c;它允许外网或者其他局域网的用户来访问这个局域网的服务器资源&#xff0c;让资源的利用率更高&#xff0c;更加灵活&#xff0c;但是也要确保网络安全。 工作原理 如果你在公司&#xff0c;但是你需要使用到你家里的那台电…...

怎么规划一个呼叫中心大模型呼入部门?设置哪些岗位?

怎么规划一个呼叫中心大模型呼入部门&#xff1f;设置哪些岗位&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 规划一个呼叫中心大模型呼入部门是一个复杂而细致的过程&#xff0c;涉及多个层面的…...

企业级Nginx Web服务优化实战(上)

一 &#xff0c;Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说 &#xff0c;软件的漏洞都和版本有关 &#xff0c;这个很像汽车的缺陷 &#xff0c;同一批次的要有问题就 都有问题 &#xff0c;别的批次可能就都是好的。 因此 &#xff0c;我们应尽量隐藏或…...

Redisson常用方法

Redisson 参考: 原文链接 定义&#xff1a;Redisson 是一个用于与 Redis 进行交互的 Java 客户端库 优点&#xff1a;很多 1. 入门 1.1 安装 <!--redission--> <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifa…...

【树莓派4B】MindSpore lite 部署demo

一个demo&#xff0c;mindspore lite 部署在树莓派4B ubuntu22.04中&#xff0c;为后续操作开个门&#xff01; 环境 开发环境&#xff1a;wsl-ubuntu22.04分发版部署环境&#xff1a;树莓派4B&#xff0c;操作系统为ubuntu22.04mindspore lite版本&#xff1a;mindspore-li…...

ESP32-S3模组上跑通ES8388(30)

接前一篇文章:ESP32-S3模组上跑通ES8388(29) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回终于解析完了es8388_init函数的所有代码。本回回到调用它的地方,继续往下讲解。 我们是从ESP32-S3模组上跑通ES8388(7)-CSDN博客开始进入es8388_init函数,展开对于它的解析的…...

网络安全渗透测试概论

渗透测试&#xff0c;也称为渗透攻击测试是一种通过模拟恶意攻击者的手段来评估计算机系统、网络或应用程序安全性的方法。 目的 旨在主动发现系统中可能存在的安全漏洞、脆弱点以及潜在风险&#xff0c;以便在被真正的恶意攻击者利用之前&#xff0c;及时进行修复和加固&…...

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …...

opencv通过3种算子进行边缘提取

Scharr算子是效果比较好的,但从肉眼看sobel算子比较顺眼 # 导入OpenCV库&#xff0c;用于图像处理 import cv2 import numpy as np # 从matplotlib库中导入pyplot模块&#xff0c;用于绘制图像 from matplotlib import pyplot as plt # 创建一个名为window的窗口&#xff0c;窗…...

【KodExplorer】可道云KodExplorer-个人网盘安装使用

说明&#xff1a;安装kodExplorer &#xff08;不是Kodbox&#xff09;&#xff1b;Kodbox需求服务器至少2核4G内存&#xff0c;要求环境具备php/redis/mysql/。安装kodExplorer 就是比较方便简单部署&#xff0c;个人版免费。 一、安装环境需求 服务器: Windows&#xff0c;…...

并查集基础

abstract 并查集&#xff08;Union-Find Set&#xff09;是一种数据结构&#xff0c;主要用于处理动态连通性问题&#xff08;Dynamic Connectivity Problem&#xff09;&#xff0c;例如在图论中判断两点是否属于同一个连通分量&#xff0c;以及动态地合并集合。 它广泛应用…...

FPGA 16 ,Verilog中的位宽:深入理解与应用

目录 前言 一. 位宽的基本概念 二. 位宽的定义方法 1. 使用向量变量定义位宽 ① 向量类型及位宽指定 ② 位宽范围及位索引含义 ③ 存储数据与字节数据 2. 使用常量参数定义位宽 3. 使用宏定义位宽 4. 使用[:][-:]操作符定义位宽 1. 详细解释 : 操作符 -: 操作符 …...

day2 数据结构 结构体的应用

思维导图 小练习&#xff1a; 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学…...

原创 传奇996_55——后端如何点击npc隐藏主界面

点击图片退出&#xff0c;举例&#xff1a; |linkexit Img|ax0.5|ay0.5|percentx50|percenty50|imgpublic/touming2.png|hideMain1|linkexit <Img|x0|y0|esc1|show4|bg1|move0|imgcustom/new/longhun/bg.png|loadDelay0|reset1|hideMain1>...

java+springboot+mysql法律咨询网

项目介绍&#xff1a; 使用javaspringbootmysql开发的法律咨询网&#xff08;文书&#xff09;&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;登录系统&#xff1b;用户管理&#xff1b;文章管理&#xff08;法律知识&#xff09…...

【AIGC】如何高效使用ChatGPT挖掘AI最大潜能?26个Prompt提问秘诀帮你提升300%效率的!

还记得第一次使用ChatGPT时&#xff0c;那种既兴奋又困惑的心情吗&#xff1f;我是从一个对AI一知半解的普通用户&#xff0c;逐步成长为现在的“ChatGPT大神”。这一过程并非一蹴而就&#xff0c;而是通过不断的探索和实践&#xff0c;掌握了一系列高效使用的技巧。今天&#…...

HarmonyOS-高级(四)

文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…...

国科大智能设备安全-APK逆向分析实验

APK逆向分析实验 使用APK常用逆向分析工具&#xff0c;对提供的移动应用程序APK文件进行逆向分析&#xff0c;提交逆向后代码和分析报告。具体任务如下&#xff1a; 任务一&#xff1a;安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法&#xff0c;对提供的Facebook Updat…...

Batch Normalization和 Layer Normalization

Batch Normalization和 Layer Normalization Batch Normalization (BN) 和 Layer Normalization (LN) 是深度学习中常用的归一化技术&#xff0c;它们的主要目的是加速训练、提高模型的收敛速度和稳定性。以下是对这两种归一化技术的详细讲解&#xff1a; 1. Batch Normalizat…...

数据结构——顺序表

顺序表的简单介绍 顺序表的概念&#xff1a;顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 特点&#xff1a;顺序表的特点是可以通过元素的索引快速访问数据&#xff0c;其访问时间复杂度…...

C语言中互斥锁、信号量和条件变量的所有相关函数、参数、返回值和说明

1. 互斥锁&#xff08;Mutex&#xff09;的使用 互斥锁用于保护共享数据&#xff0c;防止多个线程同时修改它。 #include <pthread.h> #include <stdio.h> #include <stdlib.h> // 定义一个全局共享变量 int shared_counter 0; // 定义一个互斥锁 pthrea…...

(前序 简单)leetcode 226翻转二叉树

代码随想录说用前序遍历和后序遍历方便&#xff0c;而中序遍历比较绕。 活用自定义函数使程序结构更为清晰 这里用的是前序遍历&#xff0c;根结点root指向left和root&#xff0c;交换root的左右指向 执行过程&#xff1a; 也就是交换下例的 2 &#xff0c;7 使得交换后&…...

搭建springmvc项目

什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据&#xff0c;对数据进行处理&#xff0c;…...

解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义

转载&#xff1a;self参数 - __ init__ ()方法 super(Net, self).__init__()是什么_super(net, self).init()-CSDN博客 相信大家在很多场合特别是写神经网络的代码的时候都看到过下面的这种代码&#xff1a; import torch import torch.nn as nn import torch.nn.functional …...

23种设计模式之责任链模式

目录 1. 简介2. 代码2.1 AbstractLogger&#xff08;抽象处理者&#xff09;2.2 InfoLogger &#xff08;具体处理者&#xff09;2.3 DebugLogger &#xff08;具体处理者&#xff09;2.4 ErrorLogger &#xff08;具体处理者&#xff09;2.5 Test &#xff08;测试&#xff09…...

电感2222

1 电感 1电感是什么 2 电感的电流不能突变&#xff1a;电容是两端电压不能突变 3 电感只是限制电流变化速度...

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景&#xff1a;国产化升级&#xff0c;推动道路监控产业转型 随着国家对信息安全的重视&#xff0c;国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求&#xff0c;公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…...

【人工智能-中级】卷积神经网络(CNN)的中阶应用:从图像分类到目标检测

文章目录 卷积神经网络(CNN)的中阶应用:从图像分类到目标检测1. 图像分类:CNN的基础应用CNN结构概述经典网络架构2. 目标检测:从分类到定位基于区域的目标检测方法单阶段目标检测方法边界框回归与NMS(Non-Maximum Suppression)3. 深度学习中的目标检测挑战与解决方案4. …...

从资产流动分析WIF市场潜力X.game深究其他未知因素

近日&#xff0c;两则关于WIF最新消息引起了投资者们的注意。据报道&#xff0c;11月28日Vintermute在过去13小时内累计从Binance交易所提取了价值533万美元的WIF&#xff0c;此举不仅彰显了其强大的资金实力&#xff0c;更在某种程度上推动了WIF币价的反弹&#xff1b;另一方面…...

【工具变量】上市公司企业经营困境指数数据(Zscore、Oscore、RLPM、Merton DD)2000-2021年

一、资料范围&#xff1a;包括Zscore、Oscore、RLPM、Merton DD&#xff0c;经营困境说明如下&#xff1a;&#xff08;1&#xff09;Zscore&#xff1a;以2.67和1.81作为临界值计算样本得分所处的范围。Zscore>2.67 为财务状况良好&#xff0c;发生破产的可能性较小。Zscor…...

freeswitch(监听、旁听)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch使用场景: 比如A和B在通话,C想监听他们通话内容,其他设备是不知道有人在监听的使用方法: 进入dialplan/default.xml 在配置表添加 <…...

php基础:命名空间

1.PHP 命名空间可以解决以下两类问题&#xff1a; 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名&#xff08;或简短&#xff09;的名称&#xff0c;以提高源代码的可读…...