Linux学习笔记(五)--Linux基础开发工具使用

在Linux中软件包通常是指一个包含了软件程序、元数据、依赖关系信息和安装脚本的压缩文件​​。

因为在Linux上如果没有软件包管理器,那么想要下载软件会非常麻烦,不仅需要自己去手动编译和安装,而且难以卸载和管理,所以软件包的出现解决了这些问题.软件包一般是由程序文件(编译好的可执行文件、库文件等。)和配置文件(软件默认的配置。)元数据(包含软件名称、描述、版本、维护者等信息。) 依赖列表(列出该软件正常运行所必须的其他软件包。)以及​​安装前/后脚本​(在安装或卸载前后自动运行的脚本,用于完成一些特定任务(如创建用户、启动服务等)。)​

apt/dpkt--(Ubuntu中的软件包管理器)

dpkt:是底层的包管理工具,负责实际​​安装、查询、验证​​单个 .rpm文件。但它​​无法自动解决依赖关系​​。

apt​​:是​​高层​​的包管理工具,它基于 rpm,它的核心功能是​​自动解决依赖关系​​和​​从网络仓库获取软件包​​。yum 最终还是会调用 rpm命令来完成具体的安装和卸载操作。

apt常用命令:

功能

​​Ubuntu / Debian (APT)​​

说明

​​安装软件​​

​​sudo apt install <包名>​​

安装指定软件包

​​更新软件列表​​

​​sudo apt update​​

从软件源服务器获取最新的软件包列表​​(​​apt​​必须先执行此命令)​​

​​更新所有软件​​

​​sudo apt upgrade​​

更新所有已安装的软件包(​​注意命令不同​​)

​​卸载软件​​

​​sudo apt remove <包名>​​

卸载软件包,​​保留配置文件​​

​​彻底卸载​​

​​sudo apt purge <包名>​​

卸载软件包,​​同时删除配置文件​​

​​搜索软件​​

​​apt search <关键词>​​

在仓库中搜索软件包

​​列出已安装​​

​​apt list --installed​​

列出所有已安装的包

​​获取包信息​​

​​apt show <包名>​​

显示软件包的详细信息

​​清理缓存​​

​​sudo apt clean​​ 或 ​​sudo apt autoclean​​

清理下载的软件包缓存

关于rzsz工具:

rz和 sz是 Linux 系统中用于​​通过终端(命令行)进行文件上传和下载​​的两个实用工具,通常用于 ​​ZMODEM 协议​​ 的文件传输。它们特别适合在 ​​SSH 终端​​(如 Xshell、SecureCRT、PuTTY 等)中使用,方便用户在不依赖 FTP/SFTP 的情况下快速传输文件。

作用:

命令

功能

适用场景

​​rz​​

​​Receive ZMODEM​​(接收文件)

从本地计算机上传文件到远程 Linux 服务器

​​sz​​

​​Send ZMODEM​​(发送文件)

从远程 Linux 服务器下载文件到本地计算机

使用rzsz:

(1)上传文件到Linux(rz)

在远程终端执行rz命令,跳转出一个选择文件的页面,点击你所需要上传的文件

(2)从Linux下载文件:

在远程终端执行:

sz <文件名>

你的终端会自动弹出文件保存对话框,选择保存位置即可下载。

Linux开发工具:

Linux编辑器--vim:

vim是 Linux/Unix 系统中最强大的​​文本编辑器​​之一

vim的基本模式:vim有三种主要模式,分别是命令模式(command mode)、插 入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

模式

进入方式

功能

​​普通模式(Normal Mode)​​

启动 vim或按 Esc

执行​​命令​​(如复制、粘贴、删除、保存等)

​​插入模式(Insert Mode)​​

按 iao

​​输入/编辑文本​​(类似普通编辑器)

​​命令行模式(Command Mode)​​

在普通模式下按 :

执行​​保存、退出、搜索、替换​​等操作

基本操作:

(1)打开文件

vim 文件名       # 打开文件(如果不存在则新建)
vim +10 文件名   # 打开文件并跳转到第 10 行
vim -O2 文件1 文件2  # 左右分屏打开两个文件

(2)保存和退出

命令

功能

:w

保存文件

:q

退出 vim

:wq或 :x

保存并退出

:q!

​​强制退出(不保存)​​

:w 新文件名

另存为新文件

(3)光标移动

按键

功能

hjkl

左、下、上、右移动

Ctrl + fCtrl + b

向下/向上翻页

gg

跳转到文件​​第一行​​

G

跳转到文件​​最后一行​​

10G或 :10

跳转到第 10 行

$

跳转到​​行尾​​

^或 0

跳转到​​行首​

(4)编辑文本

按键

功能

i

在​​光标前​​进入插入模式

a

在​​光标后​​进入插入模式

o

在​​下一行​​插入新行并进入插入模式

dd

​​删除当前行​​

yy

​​复制当前行​​

p

​​粘贴​​

u

​​撤销(Undo)​​

Ctrl + r

​​重做(Redo)​

(5)搜索和替换

命令

功能

/关键词

​​向下搜索​​(按 n跳转到下一个匹配)

?关键词

​​向上搜索​​

:%s/旧内容/新内容/g

​​全局替换​​(所有匹配)

:10,20s/旧内容/新内容/g

​​替换第 10-20 行的内容​

(6)分屏操作

命令

功能

:sp 文件名

​​水平分屏​​

:vsp 文件名

​​垂直分屏​​

Ctrl + w + 方向键

切换分屏

Ctrl + w + c

关闭当前分屏

(7)末行模式命令集

vim的 ​​末行模式(Command-Line Mode)​​ 是在 ​​普通模式(Normal Mode)​​ 下输入 :进入的,用于执行文件操作、搜索替换、设置选项等高级命令。

命令功能作用
set nu输入「set nu」后,会在文件中的每一行前面列出行号。列出行号
#「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15, 再回车,就会跳到文章的第15行。跳到文件中的某一行
/关键字先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n」会往后寻找到您要的关键字为止。查找字符
?关键字先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直 按「n」会往前寻找到您要的关键字为止。查找字符
w在冒号输入字母「w」就可以将文件保存起来保存文件
q按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。离开vim
wq一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件离开vim

Linux编辑器:gcc/g++使用(用来编译C语言和C++程序)

(1)安装gcc/g++(Ubuntu)

sudo apt update
sudo apt install gcc g++   # 安装 gcc 和 g++

(2)验证安装是否成功

gcc --version
g++ --version

(3)背景知识

在C/C++中要想将代码转换成可执行文件需要经过预处理,编译,汇编和链接四个步骤.

预处理阶段:

作用:处理源代码中的 ​​预处理指令​​(以 #开头的指令),比如 #include#define#ifdef等。

输入​​:.c或 .cpp文件

输出​​:.i文件(预处理后的代码)

主要操作:

​​宏替换​​(#define定义的宏会被展开)

​​头文件包含​​(#include的文件内容会被插入)

​​条件编译​​(#ifdef#ifndef等决定哪些代码会被编译)

​​删除注释​​(所有注释 //和 /* */会被移除)

使用命令(示例):

gcc -E main.c -o main.i//-E表示只进行预处理

编译阶段:

作用​​:将预处理后的代码 ​​转换成汇编代码。

​​输入​​:.i文件(或直接 .c文件)

​​输出​​:.s文件(汇编代码)

主要操作:

词法分析​​

​​语法分析​​

​​语义分析​​

​​优化​​

​​生成汇编代码​

使用命令(示例):

gcc -S main.i -o main.s//-S表示只编译

汇编阶段:

作用​​:将汇编代码 ​​转换成机器码(二进制目标文件)​​。

​​输入​​:.s文件

​​输出​​:.o文件(目标文件,Windows 上是 .obj

主要操作:

将汇编指令 ​​逐条翻译​​ 成机器码(0和 1

生成 ​​可重定位目标文件

使用命令(示例)

gcc -c main.s -o main.o//-c表示只汇编

链接阶段:

作用​​:将多个目标文件(.o)和库文件(.a或 .so) ​​合并成一个可执行文件​​。

​​输入​​:.o文件 + 库文件

​​输出​​:可执行文件(如 a.out或 .exe

主要操作:

符号解析​​:找到所有函数和变量的定义

​​重定位​​:调整代码和数据的内存地址

​​合并库​​(如 libc.solibstdc++.so

使用命令(示例)

gcc main.o -o myprogram//-o表示只链接

完整编译流程:(gcc会自动完成所有步骤)

gcc main.c -o myprogram

(4)函数库

函数库是一组预编译的函数、类或变量的集合,可以被其他程序调用。函数库通常分为 ​​静态库​​ 和 ​​动态库​​ 两种形式。

特性

静态库(.a

动态库(.so

​​文件后缀​​

.a(Unix/Linux)

.so(Unix/Linux), .dll(Windows)

​​编译时行为​​

库代码​​直接嵌入​​到可执行文件中

库代码​​不嵌入​​,仅记录依赖信息

​​运行时行为​​

无需外部库文件

需动态库文件存在于系统路径

​​磁盘空间​​

可执行文件较大(重复库代码)

可执行文件较小(共享库代码)

​​内存占用​​

每个进程独立加载库代码

多个进程共享同一份库代码

​​更新库版本​​

需重新编译可执行文件

替换 .so文件即可生效

​​加载速度​​

较快(无运行时加载开销)

稍慢(需运行时加载)

​​依赖管理​​

无外部依赖

需确保动态库存在于系统路径

创建静态库:

假设有两个源文件:

add.c:实现加法函数

sub.c:实现减法函数

编译为.o文件

gcc -c add.c -o add.o    # 生成 add.o
gcc -c sub.c -o sub.o    # 生成 sub.o

打包为静态库.a

ar rcs libmath.a add.o sub.o

ar:归档工具(Unix 静态库打包命令)。

rcs:选项组合(r替换旧文件,c创建库,s生成索引)。

使用静态库:

gcc main.c -L. -lmath -o main

-L.:指定库搜索路径(.表示当前目录)。

-lmath:链接名为 libmath.a的库(省略 lib前缀和 .a后缀)。

gcc/g++常用编译选项:

基础编译选项:

选项

作用

示例

-o <file>

指定输出文件名

gcc hello.c -o hello

-c

只编译不链接,生成 .o目标文件

gcc -c hello.c

-E

只运行预处理器(生成预处理后的代码)

gcc -E hello.c > hello.i

-S

只编译到汇编代码(生成 .s文件)

gcc -S hello.c

-v

显示详细的编译过程(调试用)

gcc -v hello.c

警告选项:

选项

作用

示例

-Wall

开启所有常见警告

gcc -Wall hello.c

-Wextra

启用额外警告(比 -Wall更严格)

gcc -Wextra hello.c

-Werror

将警告视为错误(强制修复)

gcc -Werror hello.c

-Wno-<warning>

禁用特定警告

gcc -Wno-unused-variable hello.c

调试选项:

选项

作用

示例

-g

生成调试信息(用于 GDB)

gcc -g hello.c -o hello

-ggdb

生成更详细的 GDB 调试信息

gcc -ggdb hello.c

-p-pg

生成性能分析(gprof 用)

gcc -pg hello.c

优化选项:

选项

优化级别

说明

-O0

无优化

编译速度快,适合调试

-O1

基础优化

平衡代码大小和执行速度

-O2

中等优化

推荐大多数场景使用

-O3

激进优化

可能增加代码体积

-Os

优化代码大小

嵌入式系统常用

-Ofast

激进优化(忽略严格标准)

可能影响精度

Linux调试器--gdb的使用:

(1)安装gdb(Ubuntu)

sudo apt install gdb

(2)启动gdb

gdb ./hello   # 调试可执行文件

(3)gdb基本命令

命令

功能描述

list/l [行号]

显示源代码。从指定行号(或上次位置)开始,每次列出10行。

list/l [函数名]

列出指定函数的源代码。

run/r

开始运行程序。

next/n

单步执行(​​不​​进入函数体)。

step/s

单步执行(​​会​​进入函数体)。

break/b [行号]

在指定行设置断点。

break/b [函数名]

在指定函数的开头设置断点。

info break

查看所有已设置的断点信息(包括编号、位置等)。

finish

持续执行直至​​当前函数返回​​,然后暂停。

print/p [表达式]

打印表达式的值。表达式可为变量、或可调用函数。

p [变量]

打印变量的值。

set var [变量]=[值]

修改变量的值。

continue/c

从当前位置开始​​连续​​执行程序(而非单步),直到下一个断点或结束。

run/r

​从头开始​​连续执行程序。

delete breakpoints

​删除所有​​断点。

delete breakpoints [n]

删除​​指定序号 n​​ 的断点。

disable breakpoints

​禁用​​所有断点(断点仍存在,但不会暂停)。

enable breakpoints

​启用​​所有断点。

info/i breakpoints

查看当前设置的所有断点信息。

display [变量名]

​持续跟踪​​查看一个变量,每次程序暂停时都会显示其值。

undisplay

​取消​​之前通过 display设置的变量跟踪。

until [X行号]

持续运行直至​​指定行 X​​(用于跳出循环等场景)。

backtrace/bt

查看函数的​​调用栈​​(层层调用的关系)及参数。

info/i locals

查看​​当前函数栈帧​​内所有局部变量的值。

quit

退出 GDB 调试器。

Linux项目自动化构建工具--make/Makefile

make是Linux/Unix系统中一个强大的自动化构建工具,它通过读取Makefile文件来自动化编译和构建过程。make工具的主要功能包括:自动确定需要重新编译的文件,根据依赖关系按正确顺序编译,只重新编译修改过的文件及其依赖项.make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建.

Makefile基础语法:

target: prerequisitesrecipe

​​target​​:通常是生成的文件名,也可以是一个操作名称(伪目标)

​​prerequisites​​:生成target所需的文件或目标

​​recipe​​:生成target需要执行的命令(必须以tab开头)

示例:

#include <stdio.h>int main(){printf("hello Makefile!\n");return 0;}

makefile文件:

hello: hello.cgcc -o hello hello.cclean:rm -f hello

那么make的工作原理是怎样的?

接下来为大家解释一下:

make会在当前目录下找名字叫“Makefile”或“makefile”的文件。如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件, 并把这个文件作为最终的目标文件。如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可 以用touch测试),那么,他就会执行后面所定义的命令来生成hello这个文件。如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果 找到则再根据那一个规则生成hello.o文件(这有点像一个堆栈的过程)。当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明 make的终极任务,也就是执行文件hello了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。

流程图如下:

行缓冲区概念:

行缓冲区的三种类型:

行缓冲:遇到换行符\n时刷新缓冲区,或缓冲区填满时刷新(典型应用:终端标准输出)

核心特点:

#include <stdio.h>
int main() {printf("This will be buffered");  // 行缓冲,未遇到\n不立即显示printf(" until newline\n");       // 遇到\n,刷新缓冲区return 0;
}

行缓冲触发的三种情况:

(1)遇到换行符\n

(2)缓冲区已满(通常1024或4096字节)

(3)主动调用fflush(stdout)

例:

#include <stdio.h>int main(){printf("hello Makefile!");fflush(stdout);sleep(3);return 0;}

如果不调用fflush(),由于没有\n,进度条可能不会实时显示

编写自己的第一个Linux小程序--进度条:

(1)先在这里设定好的目录下建立一个cpp文件

vim progressbar.cpp

(2)编译进度条代码

(3)编译文件

g++ -o progress progress.cpp

(4)运行文件

./progress

完成截图

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

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

相关文章

数据结构(陈越,何钦铭) 第十讲 排序(下)

10.1 快速排序 10.1.1 算法概述10.1.2 选主元10.1.3 子集划分10.1.4 算法实现10.2 表排序 10.2.1 算法概述10.2.2 物理排序10.3 基数排序 10.3.1 桶排序10.3.2 基数排序10.3.3 多关键字的排序10.4 排序算法的比较

vue 使用print.js 打印文本,HTML元素,图片,PDF

vue 使用print.js 打印文本,HTML元素,图片,PDF 安装 npm install print-js --save示例 <template><div class"print-example"><h2>Print.js 打印示例</h2><!-- 打印区域 --><div id"printableArea" class"printable…

jenkins审批机器人功能概述-Telegram版

Jenkins审批机器人 - 功能概述 代码链接&#xff0c;私聊可得 项目简介 Jenkins审批机器人是一个集成Jenkins CI/CD流程的自动化审批系统&#xff0c;通过Telegram机器人提供便捷的发布审批功能。该系统支持多环境部署审批、用户权限管理、构建结果通知等完整的DevOps审批流程。…

Rust : 关于解引用“*”

关于解引用*操作符&#xff0c;谨供参考&#xff01; 一、主要代码 use std::ops::Deref; fn main() {model_1();model_2();model_3();model_4();model_5();model_6();model_7();model_8();model_9(); }二、*操作符与常见的引用和解引用 fn model_1(){let reference:&St…

【高级终端Termux】在安卓手机/平板上使用Termux 搭建 Debian 环境并运行 PC 级 Linux 应用教程(含安装WPS,VS Code)

Termux 搭建 Debian 环境并运行 PC 级 Linux 应用教程 一、前言 1. 背景 众所周知&#xff0c;最新搭载澎湃OS和鸿蒙OS的平板都内置了PC级WPS&#xff0c;办公效率直接拉满&#xff08;板子终于从“泡面盖”升级为“生产力”了&#xff09;。但问题来了&#xff1a;如果不是这…

从循环到矩阵运算:矢量化加速机器学习的秘诀

矢量化实现全解析&#xff1a;从原理到实战 在学习数据科学、机器学习和深度学习的过程中&#xff0c;我们经常会听到一个高频词——矢量化&#xff08;Vectorization&#xff09;。很多库的官方文档、教程里也不断强调“要尽量使用矢量化操作&#xff0c;而不是显式循环”。那…

大数据毕业设计-大数据-基于大数据的热门游戏推荐与可视化系统(高分计算机毕业设计选题·定制开发·真正大数据)

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

从零到一:用 Qt + libmodbus 做一个**靠谱**的 Modbus RTU 小工具(实战总结)

文章目录从零到一&#xff1a;用 Qt libmodbus 做一个**靠谱**的 Modbus RTU 小工具&#xff08;实战总结&#xff09;你会得到什么快速背景&#xff1a;为什么是 Modbus RTU&#xff1f;协议速查&#xff08;够用不啰嗦&#xff09;工程结构与 UI 组织连接“三板斧”&#xf…

使用Python创建本地Http服务实现与外部系统数据对接

在Python 3.10中创建一个能够处理GET和POST请求的本地HTTP服务器&#xff0c;并提供一个默认的 index.html 页面是完全可行的。Python的标准库中的 http.server 模块虽然简单&#xff0c;但通过一些自定义扩展可以满足这个需求。 下面我将提供一个实现方案&#xff0c;它包含一…

了解篇 | StarRocks 是个什么数据库?

今天简要介绍一下StarRocks 这个强大的数据库。注意&#xff1a;本文章内容仅供个人学习&#xff0c;不包含任何推荐性质。StarRocks&#xff08;原名 Doris&#xff09;是一个高性能、全场景的MPP&#xff08;大规模并行处理&#xff09;分析型数据库。它专为极速的多维联机分…

SSL部署完成,https显示连接不安全如何处理?

在部署 SSL 后&#xff0c;如果浏览器仍然显示 “连接不安全” 或 “Not Secure”&#xff0c;通常是由以下几种原因导致的。针对每种可能的原因和问题&#xff0c;以下提供了详细的排查和解决方案。 1. 排查问题的可能原因 1.1 SSL 证书未正确安装 如果 SSL 证书安装不完整或…

LeetCode热题100--105. 从前序与中序遍历序列构造二叉树--中等

1. 题目 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,n…

【WitSystem】详解JWT在系统登录过程中前端做了什么事,后端又做了什么事?

要理解 JWT&#xff08;JSON Web Token&#xff09;登录流程中前端与后端的职责分工&#xff0c;需先明确 JWT 的核心定位&#xff1a;它是一种无状态的身份认证令牌&#xff0c;用于替代传统 Session 认证&#xff0c;解决跨服务、跨域登录的问题。其流程本质是“后端生成令牌…

MongoDB 在线安装-一键安装脚本(CentOS 7.9)

1. 脚本概述本脚本用于在 CentOS 7.9 系统上在线安装 MongoDB&#xff0c;自动处理端口占用和重复安装问题&#xff0c;并创建管理员用户 test8&#xff0c;密码 test123。2. 功能停止并关闭防火墙检查 27017 端口占用并结束进程如果已安装 MongoDB&#xff0c;卸载重装配置 Mo…

树形数据结构之树状基础-算法赛

今天给分享的是一道算法决赛的题目&#xff0c;这道题目的综合要求比较高&#xff0c;希望大家可以好好理解&#xff0c;同时这道题用到的是树状树形结构的有关知识。可以用这几天学的相关内容结合起来。问题描述给定两个长度为 N的排列 A 和 B。若一对二元组下标 (i,j) 满足以…

Jenkins 构建清理策略:自带功能 vs Discard Old Build 插件,全场景实操指南

前言&#xff1a;在 Jenkins 持续集成过程中&#xff0c;构建记录、工作空间、产物包会不断积累&#xff0c;既占用磁盘空间&#xff0c;也会让构建历史变得臃肿。Jenkins 自带的“丢弃旧的构建”功能和 Discard Old Build 插件&#xff0c;是两种常见的构建清理方案。本文将详…

Leetcode | Hot100

文章目录两数之和字母异位词分组最长连续序列移动零盛水最多的容器三数之和接雨水无重复字符的最长子串找到字符串中所有字母异位词和为 K 的子数组滑动窗口最大值最小覆盖子串最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数矩阵置零螺旋矩阵旋转图像搜索二…

【论文阅读】Uncertainty Modeling for Out-of-Distribution Generalization (ICLR 2022)

论文题目&#xff1a;Uncertainty Modeling for Out-of-Distribution Generalization 论文来源&#xff1a;ICLR 2022 论文作者&#xff1a; 论文链接&#xff1a;https://arxiv.org/pdf/2202.03958 论文源码&#xff1a;https://github.com/lixiaotong97/DSU ​ 一、摘要…

分布式系统单点登录(SSO)状态管理深度解析:从Cookie+Session到JWT的演进之路

分布式系统单点登录(SSO)状态管理深度解析&#xff1a;从CookieSession到JWT的演进之路作者&#xff1a;默语佬 | CSDN博主 在分布式微服务架构盛行的今天&#xff0c;单点登录已成为企业级应用的标准配置。本文将深入探讨SSO状态管理的技术演进&#xff0c;从传统的CookieSess…

从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移

从 WPF 到 Avalonia 的迁移系列实战篇7&#xff1a;EventTrigger 的迁移 在 WPF 中&#xff0c;EventTrigger 是非常常用的功能&#xff0c;它可以让我们直接在 XAML 中绑定事件与动画或动作&#xff0c;实现 UI 的交互效果。例如按钮点击时旋转、鼠标悬停时变色等。 然而&…