【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用
目录
- 1.理解软硬链接
- 1.1 操作观察现象
- 软链接
- 硬链接
- 1.2 软硬链接的原理
- 测试硬链接
- 测试软链接
- 1.3 软硬链接的应用场景
- 1.3.1软链接
- 1.3.2 硬链接
- 2.动静态库
- 2.1 动静态库的制作和使用
- 准备工作
- 生成静态库
- 生成动态库
- 2.2 将自己的库打包给别人
1.理解软硬链接
软链接和硬链接是在Linux系统中常见的文件链接方式。
软链接(Symbolic Link): 软链接是一个指向目标文件或目录的特殊文件,类似于Windows系统中的快捷方式。软链接可以跨文件系统,可以链接到目录,也可以链接到文件。软链接的特点是:
- 软链接文件有自己的inode和文件名,但是数据块内容是指向目标文件的路径。
- 删除软链接不会影响目标文件。
- 软链接可以跨文件系统,即可以链接到不同的磁盘分区。
硬链接(Hard Link): 硬链接是指多个文件名指向同一个inode,它们共享同一份数据块内容。硬链接的特点是:
- 硬链接文件和目标文件具有相同的inode和数据块内容。
- 删除任意一个硬链接文件不会影响其他硬链接文件和目标文件。
- 硬链接只能链接到文件,不能链接到目录。
- 硬链接不能跨文件系统,即只能在同一个磁盘分区内创建。
1.1 操作观察现象
指令ln -s
ln -s
是Linux系统中的一个命令,用于创建软链接(symbolic link)。软链接是一种特殊的文件,它指向另一个文件或目录。通过软链接,可以在不改变原始文件或目录位置的情况下,创建一个指向它的链接。
使用ln -s命令创建软链接的语法如下:
ln -s <原始文件或目录路径> <链接文件路径>
- 其中,<原始文件或目录路径>是要创建链接的文件或目录的路径,<链接文件路径>是要创建的软链接的路径。
例如,假设当前目录下有一个文件file.txt,我们可以使用以下命令创建一个指向它的软链接:
ln -s file.txt link.txt
这样就创建了一个名为link.txt的软链接,它指向file.txt文件。
需要注意的是,软链接是一个指向原始文件或目录的引用,而不是实际的文件或目录本身。删除软链接不会影响原始文件或目录,但删除原始文件或目录可能会导致软链接失效。
指令ll -li
ll -li
是一个Linux命令,用于显示文件或目录的详细信息,并以inode号进行排序。下面是该命令的一些说明:
ll
是 “ls -l” 的简写,用于显示文件和目录的详细信息。-li
是两个选项的组合,其中-l
表示以长格式显示文件信息,包括文件权限、所有者、大小、修改日期等;而-i
表示显示文件的inode号。
通过执行 ll -li
命令,您将看到当前目录下所有文件和目录的详细信息,并按照inode号进行排序。
软链接
结论:软链接本质上就是一个文件,有独立的inode
指令ln
在Linux系统中创建文件硬链接,可以通过ln
命令来创建硬链接。ln
命令的语法如下:
ln [选项] <源文件或目录> <目标文件或目录>
其中,源文件或目录是要创建链接的文件或目录的路径,目标文件或目录是要创建的链接的路径。
创建硬链接的命令格式为:
ln <源文件> <目标文件>
例如,要在当前目录下创建一个名为linkfile的硬链接,指向源文件sourcefile,可以使用以下命令:
ln sourcefile linkfile
注意,硬链接只能链接到同一个文件系统中的文件,且不能链接到目录。
硬链接
我们创建了硬链接之后可以发现。前面的文件信息发生了一个微小的变化,也就是文件权限后面的数字由1变成了2,而硬链接新出现的文件其初始数字就是2,这个数字从来没有讲述过
我们查看一下inode也可以发现,新出现的文件与旧文件inode竟然是一样的!
结论:硬链接本质不是一个独立的文件,因为它的inode编号和目标文件相同
1.2 软硬链接的原理
测试硬链接
- 我们将硬链接的目标文件写入点数据
可以看到我们修改目标文件的同时,硬链接生成的文件也会发生变化,其大小与目标文件同样是12,且修改时间相同,inode也没有改变
- 我们删除目标文件
可以看到,我们的硬链接产生的文件并没有什么变化,我们查看其文件数据可以清楚的看到,这个数据就是我们当初输入到目标文件的数据,这是什么情况?
其实也可以理解,其inode和目标文件是一摸一样的,也就是说他们对应的都是同一个文件,我们硬链接的工作特别像给目标文件进行一个重命名,并且源文件不改变。
硬链接的本质:一定没有新建文件,因为没有新的inode,只是新建了一个文件名,与目标文件inode相同的映射关系。
这个时候我们再看当初的这个2
其实这就是一个硬链接数,表明有多少个硬链接,表明了有多少个文件名与这一块数据有相同的映射关系,同时也叫引用计数
同时可以看到,硬链接就是建立了一个映射关系同时对引用计数++即可。
我们删掉文件后可以看到,引用计数从2变成了1
测试软链接
软链接创建的文件有独立的inode,有独立的inode那么就有独立的属性以及独立的数据内容。
软链接本质就是一个独立文件,软链接内容里面放的目标文件的路径!
软链接就相当于我们Windows里面的快捷方式,其存储的就是其可执行程序的路径
1.3 软硬链接的应用场景
1.3.1软链接
- 我们创建一系列文件并输入内容给test.c
#include<stdio.h>
int main()
{printf("hello world\n");return 0;
}
- 将文件编译,并把可执行文件移动到bin目录下
- 我们想访问这个可执行文件就只能访问绝对路径访问
- 我们还可以采用软链接的方式访问到这个可执行文件
我们就可以使用软链接的方式,在当前目录创建一个软链接的文件,这样就可以直接访问到深路径的文件,我们使用起来就更加方便
我们也可以采用硬链接的方式来达到访问深路径的文件
软链接使用起来还是更加方便一些,一般推荐软链接
系统有很多的软链接
ls -l /lib64/
1.3.2 硬链接
- 我们创建一个普通文件以及一个目录
可以发现普通文件的硬链接数是1,而目录一创建出来硬链接数就是2。
- 我们进入empty目录下
我们可以看到empty目录下有隐藏的点文件,我们之前讲过,这个就是指的当前目录,它的inode与empty目录的inode是一模一样的,而它就是除了empty外另一个硬链接。
- 我们进入empty目录下再创建一个a目录
这里可以看到我们的empty目录的硬链接数变成了3,这就是因为我们empty目录里的a目录里有一个自带的点点文件,这代表的是上级目录,它就是第三个empty目录的硬链接
由此得知:一个目录下有多少个子目录:硬链接数-2即可计算得到
注意:Linux中不允许给目录建立硬链接,但是可以建立软链接
2.动静态库
-
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
-
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
-
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
-
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
-
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
我们是很经常使用库的,我们创建一个普通C文件,并编写简单代码
这里就是利用了C语言的库的,之前进行简单的讲解过,这是C语言的动态库
关于库我们有过一定的使用经验
库分为静态库以及动态库-----大部分的系统默认安装的是动态库,云服务器是静态库–(C标准库)默认是没有安装的
默认编译程序,用的是动态链接的,如果要静态要加-static
库的真实名字:lib. XXXX -a/so 去掉前缀以及后缀
2.1 动静态库的制作和使用
一般我们的程序执行会经历几个阶段
a.h + a.c ---> a.o
b.h + b.c ---> b.o
c.h + c.c ---> c.o
d.h + d.c ---> d.o
- 再结合
libc.so/libc.a
- 最后
main.c ------>main.o
库则是不提供
.c
文件
a.h + a.o
b.h + b.o
c.h + c.o
d.h + d.o
你只需要将
main.c ------>main.o
注:这里的a、b、c、d只是概念文件
所谓的库就是将所有的.o
文件用特定的方式,进行打包,形成一个文件
库的存在的意义:
- 提高开发效率
- 隐藏源代码
准备工作
在了解库的使用原理后我们来模拟实现一个
- 创建五个文件
- 编写文件
add.c
#include "add.h"
int add(int a, int b)
{return a + b;
}
add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif // __ADD_H__
sub.h
#ifndef __SUB_H__
#define __SUB_H__
int sub(int a, int b);
#endif // __SUB_H
sub.c
#include "add.h"
int sub(int a, int b)
{return a - b;
}
main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"int main()
{int a = 10;int b = 20;printf("add(%d, %d)=%d\n", a, b, add(a, b));a = 100;b = 20;printf("sub(%d,%d)=%d\n", a, b, sub(a, b));
}
生成.o文件
生成静态库
指令ar -rc
ar -rc是一个用于创建或更新静态库的命令。它是GNU工具链中的一个工具,用于将一组目标文件打包成一个静态库文件。下面是ar -rc命令的一些常见用法:
- 创建静态库:可以使用ar -rc命令将多个目标文件打包成一个静态库文件。例如,要将文件1.o、文件2.o和文件3.o打包成一个名为libexample.a的静态库,可以执行以下命令:
ar -rc libexample.a 1.o 2.o 3.o
- 更新静态库:如果已经存在一个静态库文件,可以使用ar -rc命令向其中添加新的目标文件或替换已有的目标文件。例如,要向名为libexample.a的静态库中添加一个新的目标文件file.o,可以执行以下命令:
ar -rc libexample.a file.o
- 替换静态库中的目标文件:如果要替换静态库中已有的目标文件,可以使用ar -rc命令指定相同的目标文件名。例如,要替换名为libexample.a的静态库中的目标文件file.o,可以执行以下命令:
ar -rc libexample.a file.o
- 查看静态库内容:可以使用ar -t命令来查看静态库中包含的目标文件列表。例如,要查看名为libexample.a的静态库中包含的目标文件列表,可以执行以下命令:
ar -t libexample.a
输入指令
ar -rc libmymath.a add.o sub.o
生成静态库
查看静态库中的目录列表ar -tv libmymath.a
t:列出静态库中的文件
v:verbose 详细信息
所以库的本质就是把一堆.o打包形成一个文件,然后通过头文件来调用库。注意,库中不能包含main函数。
编译一下,即可运行
gcc (要形成的可执行文件名) main.c(所依赖的文件) -L .(-L + 路径表示myc这个库在哪个路径下)-lmymath(指明要链接mymath这个静态库)
生成动态库
fPIC:产生位置无关码,在将.c或者.cpp形成.o文件时,需要加上-fPIC。要形成动态库必须加上-fPIC。
形成动态库不需要用到其它指令,gcc编译器就可以形成动态库,只不过要加上-shared命令。
gcc -shared -o libmymath.so(名字,真正的库名要去掉lib和.so)sub.o add.o (所依赖的.o文件)
直接使用我们的这个动态库,那么就同样要告诉编译器我们库的名字和所在的路径(参考上面静态库路径的写法)。
2.2 将自己的库打包给别人
假设在我当前目录下有libmymath.so动态库,add.h,sub.h两个头文件,如果我想将这三个文件一起交给别人,就可以把它们打包一起放在一个目录下,一起压缩完再交给别人。
Makefile
1 libmymath.so:add.o sub.o2 gcc -shared -o $@ $^3 .o:.c4 gcc -shared -c $<5 #add.o:add.c6 # gcc -c -fPIC $< -o $@7 #sub.o:sub.c8 # gcc -c -fPIC $< -o $@9 .PHONY:clean10 clean:11 rm -f *.o libmymath.so12 13 .PHONY:output 14 output:15 mkdir -p ./user/mylib/16 mkdir -p ./user/Headfile/17 cp -rf libmymath.so ./user/mylib/18 cp -rf add.h sub.h ./user/Headfile/19 tar -czf user.tgz user
user目录是通过user.tgz解压得到的,下面是user目录下的文件:
将两个头文件拷贝到usr/include目录下(编译器默认会到include目录下去寻找头文件),将库文件拷贝到usr/lib目录下,编译时指定库链接,就能够运行了。
相关文章:
【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用
🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.理解软硬链接1.1 操作观…...
xss常用标签和触发事件
无过滤情况 <script> <scirpt>alert("xss");</script> <img> 图片加载错误时触发 <img src"x" οnerrοralert(1)> <img src"1" οnerrοreval("alert(xss)")> 鼠标指针移动到元素时触发 <im…...
WPF中Binding的原理和应用
WPF中Binding的原理和应用 在WPF中,Binding机制是实现数据与界面的连接和同步的重要工具。了解Binding的原理和应用,对于开发人员来说是非常重要的。本文将详细介绍WPF中Binding的原理和应用,帮助读者更好地理解和运用这一强大的机制。 Bin…...
探索设计模式的魅力:深度挖掘响应式模式的潜力,从而精准优化AI与机器学习项目的运行效能,引领技术革新潮流
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 挖掘响应式模式,优化AI与机器学习项目性能,引领技术新潮流 ✨机器学习界的…...
《经典论文阅读2》基于随机游走的节点表示学习—Deepwalk算法
word2vec使用语言天生具备序列这一特性训练得到词语的向量表示。而在图结构上,则存在无法序列的难题,因为图结构它不具备序列特性,就无法得到图节点的表示。deepwalk 的作者提出:可以使用在图上随机游走的方式得到一串序列&#x…...
Java实现二叉树(下)
1.前言 http://t.csdnimg.cn/lO4S7 在前文我们已经简单的讲解了二叉树的基本概念,本文将讲解具体的实现 2.基本功能的实现 2.1获取树中节点个数 public int size(TreeNode root){if(rootnull){return 0;}int retsize(root.left)size(root.right)1;return ret;}p…...
Hello 算法10:搜索
https://www.hello-algo.com/chapter_searching/binary_search/ 二分查找法 给定一个长度为 n的数组 nums ,元素按从小到大的顺序排列,数组不包含重复元素。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素,则返回 -1 。 # 首…...
常见分类算法详解
在机器学习和数据科学的广阔领域中,分类算法是至关重要的一环。它广泛应用于各种场景,如垃圾邮件检测、图像识别、情感分析等。本文将深入剖析几种常见的分类算法,帮助读者理解其原理、优缺点以及应用场景。 一、K近邻算法(K-Nea…...
推送恶意软件的恶意 PowerShell 脚本看起来是人工智能编写的
威胁行为者正在使用 PowerShell 脚本,该脚本可能是在 OpenAI 的 ChatGPT、Google 的 Gemini 或 Microsoft 的 CoPilot 等人工智能系统的帮助下创建的。 攻击者在 3 月份的一次电子邮件活动中使用了该脚本,该活动针对德国的数十个组织来传播 Rhadamanthy…...
微服务之Consul 注册中心介绍以及搭建
一、微服务概述 1.1单体架构 单体架构(monolithic structure):顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。 当项…...
MES生产管理系统:私有云、公有云与本地化部署的比较分析
随着信息技术的迅猛发展,云计算作为一种新兴的技术服务模式,已经深入渗透到企业的日常运营中。在众多部署方式中,私有云、公有云和本地化部署是三种最为常见的选择。它们各自具有独特的特点和适用场景,并在不同程度上影响着企业的…...
【core analyzer】core analyzer的介绍和安装详情
目录 🌞1. core和core analyzer的基本概念 🌼1.1 coredump文件 🌼1.2 core analyzer 🌞2. core analyzer的安装详细过程 🌼2.1 方式一 简单但不推荐 🌼2.2 方式二 推荐 🌻2.2.1 安装遇到…...
个人练习之-jenkins
虚拟机环境搭建(买不起服务器 like me) 重点: 0 虚拟机防火墙关闭 systemctl stop firewalld.service systemctl disable firewalld.service 1 (centos7.6)网络配置 (vmware 编辑 -> 虚拟网络编辑器 -> 选择NAT模式 ->NAT设置查看网关) vim /etc/sysconfig/network-sc…...
初探vercel托管项目
文章目录 第一步、注册与登录第二步、本地部署 在个人网站部署的助手vercel,支持 Github部署,只需简单操作,即可发布,方便快捷! 第一步、注册与登录 进入vercel【官网】,在右上角 login on,可登…...
软考 - 系统架构设计师 - 质量属性例题 (2)
问题1: 、 问题 2: 系统架构风险:指架构设计中 ,潜在的,存在问题的架构决策所带来的隐患。 敏感点:指为了实现某个质量属性,一个或多个构件所具有的特性 权衡点:指影响多个质量属性…...
基于Python豆瓣电影数据可视化分析系统的设计与实现
大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现 2024最新项目 项目介绍 本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示,构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据,我们提供了…...
【已开源】基于stm32f103的爬墙小车
基于stm32f103的遥控器无线控制爬墙小车,实现功能为可平衡在竖直墙面上,并进行移动和转向,具有超声波防撞功能。 直接上: 演示视频如:哔哩哔哩】 https://b23.tv/BzVTymO 项目说明: 在这个项目中&…...
PCL 基于马氏距离KMeans点云聚类
文章目录 一、简介二、算法步骤三、代码实现四、实现效果参考资料一、简介 在诸多的聚类方法中,K-Means聚类方法是属于“基于原型的聚类”(也称为原型聚类)的方法,此类方法均是假设聚类结构能通过一组原型刻画,在现实聚类中极为常用。通常情况下,该类算法会先对原型进行初始…...
libVLC 视频窗口上叠加透明窗口
很多时候,我们需要在界面上画一些三角形、文字等之类的东西,我们之需要重写paintEvent方法,比如像这样 void Widget::paintEvent(QPaintEvent *event) 以下就是重写的代码。 void Widget::paintEvent(QPaintEvent *event) {//创建QPainte…...
MySQL基础入门上篇
MySQL基础 介绍 mysql -uroot -p -h127.0.0.1 -P3306项目设计 具备数据库一定的设计能力和操作数据的能力。 数据库设计DDL 定义 操作 显示所有数据库 show databases;创建数据库 create database db02;数据库名唯一,不能重复。 查询是否创建成功 加入一些…...
Docker搭建FFmpeg
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的完整解决方案。FFmpeg 包含了领先的音视频编解码库libavcodec,可以用于各种视频格式的转换。 应用场景包括: 视频转换:把视频从一种格式转换成另一种格式。视…...
Hudi-ubuntu环境搭建
hudi-ubuntu环境搭建 运行 1.编译Hudi #1.把maven安装包上传到服务器 # 官网下载安装包 https://archive.apache.org/dist/maven/maven-3/ scp -r D:\Users\zh\Desktop\Hudi\compressedPackage\apache-maven-3.6.3-bin.tar.gz zhangheng10.8.4.212:/home/zhangheng/hudi/com…...
Hive进阶Day05
一、HDFS分布式文件存储系统 1-1 HDFS的存储机制 按块(block)存储 hdfs在对文件数据进行存储时,默认是按照128M(包含)大小进行文件数据拆分,将不同拆分的块数据存储在不同datanode服务器上 拆分后的块数据会被分别存储在不同的服…...
ssh爆破服务器的ip-疑似肉鸡
最近发现自己的ssh一直有一些人企图使用ssh暴力破解的方式进行密码破解.就查看了一下,真是网络安全太可怕了. 大家自己的服务器密码还是要设置好,管好,做好最基本的安全措施,不然最后只能沦为肉鸡. ssh登陆日志可以在/var/log下看到,ubuntu的话为auth.log,centos为secure文件 查…...
4.JVM八股
JVM空间划分 线程共享和线程私有 1.7: 线程共享: 堆、方法区 线程私有: 虚拟机栈、本地方法栈、程序计数器 本地内存 1.8: 线程共享: 堆 线程私有: 老三样 本地内存,元空间 程序计数器 …...
内网渗透系列-mimikatz的使用以及后门植入
内网渗透系列-mimikatz的使用以及后门植入 文章目录 内网渗透系列-mimikatz的使用以及后门植入前言mimikatz的使用后门植入 msf永久后门植入 (1)Meterpreter后门:Metsvc(2)Meterpreter后门:Persistence NC后…...
5G网络开通与调测ipv4
要求如下: 1. 勘站规划 1. 【重】首先观察NR频点,完成设备选型 2645--选择N41 3455--选择N78 4725--选择N79 设备选型如下:观察AAU的通道数,最大发射功率;选择N41的选型频段也要选41 2. …...
Spark开窗函数之ROW
Spark 1.5.x版本以后,在Spark SQL和DataFrame中引入了开窗函数,其中比较常用的开窗函数就是row_number 该函数的作用是根据表中字段进行分组,然后根据表中的字段排序;其实就是根据其排序顺序,给组中的每条记录添 加一个序号;且每组的序号都是从1开始,可利用它的这个特性进行分组…...
双向链表的实现(详解)
目录 前言初始化双向链表的结构为双向链表的节点开辟空间头插尾插打印链表尾删头删查找指定位置之后的插入删除pos节点销毁双向链表 前言 链表的分类: 带头 不带头 单向 双向 循环 不循环 一共有 (2 * 2 * 2) 种链表 带头指的是:带有哨兵位节点 哨兵位&a…...
SpringBoot项目中如何使用校验工具
用到hutool提供的校验方法与java提供的校验方法 1. 声明数据 String str "123" String regex "^123456$" Boolean is1_6 mismatch(str, regex);2. 定义校验方法 // 校验是否不符合正则格式 private static boolean mismatch(String str, String rege…...
临沂罗庄建设局网站/广州推广seo
usermod:usermod [options] user_nameusermod 命令修改系统帐户文件来反映通过命令行指定的变化选项(options)-a|--append ##把用户追加到某些组中,仅与-G选项一起使用 -c|--comment ##修改/etc/passwd文件第五段comment -d|--home ##修改用户的家目…...
花卉网站建设策划书/什么是搜索引擎优化的核心
对于 React 组件来说,refs 会指向一个组件类的实例,所以可以调用该类定义的任何方法。 如果需要访问该组件的真实 DOM,可以用 ReactDOM.findDOMNode 来找到 DOM 节点,但我们并 不推荐这样做。因为这在大部分情况下都打破了封装性&…...
无锡嘉饰茂建设网站的公司/seo网站优化方
Hello, 这里是心研书籍,我是明明~ 昨天已经立夏了,大家有没有感觉到夏天的灼热呢?俗话说,春困秋乏夏打盹,进入夏日,濡湿的暑气慢慢沁入每个人的生活。“我今天状态不好”,相信在炎…...
个人网站备案建设方案书/微信搜一搜seo优化
动画实现:首选css3动画,但是有些是不单单使用css动画就能实现的,如下案例: 下拉列表展开和收起,三角图标的切换:列表收起-》展开设置display:none-》block,但是这种没有过渡动画&am…...
深圳博彩软件网站建设/优化设计电子课本下载
//ATK-ESP8266模块测试主函数,检查WIFI模块是否在线 void atk_8266_test(void) {while(atk_8266_send_cmd("AT","OK",200))//检查WIFI模块是否在线{atk_8266_quit_trans();//退出透传atk_8266_send_cmd("ATCIPMODE0","OK",200); //关…...
唐山市做网站/市场营销案例
一 BOM JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准。包括变量、表达式、运算符、函数、if语句、for语句等。 DOM:文档对象模型,操作网页上的元素的API。比如让盒子移动、变色、轮播图等。 BOM:浏…...