Linux之基础开发工具

news2024/11/20 3:34:04

文章目录

  • 前言
  • 一、yum(软件包管理器)
    • 1.什么是软件包?
    • 2.下载软件包
      • 1. 安装软件之前需要将软件的安装包下载下来
      • 2. 软件包并不在我们的本地电脑,那么软件包在哪里呢?
      • 3. 那么问题来了,我们的电脑如何得知要去哪里找软件安装包呢?(我的电脑怎么知道我要下载的软件安装包在那一台服务器上呢?)
      • 4.谁提供软件包?谁放在服务器?
    • 3.yum
      • 1.验证主机网络
      • 2.查看软件包
      • 3.安装软件
        • 例子:第一个安装的软件lrzsz
      • 4.卸载软件
      • 5.扩展内容
        • 1.查看yum源的配置文件
        • 2.用其他的yum源替换我们自己云服务器的yum源配置。
        • 3.非官方的软件集
  • 二、vim(编辑器)
    • 1.vim的介绍
    • 2.vim的基本操作
      • 1.进入vim
      • 2.正常模式的操作
        • 1.正常模式切换到插入模式
        • 2.从正常模式切换到底行模式
        • 3.移动光标
        • 4.删除
        • 4.复制
        • 5.粘贴
        • 6.替换模式
        • 7. 撤销上一次操作
      • 3.底行模式的操作
        • 1.行号
        • 2.分屏
        • 3.执行shell指令
        • 3.底行替换
        • 4.保存和退出文件
    • 3.vim的配置
  • 三、gcc/g++(编译器)
    • 1.编译链接的过程
    • 2.gcc/g++的使用
      • 1.预处理
      • 2.编译
      • 3.汇编
      • 4.链接
    • 3.函数库
      • 1.库函数
      • 2.为什么要存在数据库?
    • 4.静态链接和动态链接
      • 1.动态链接
        • 1.用一个小故事理解动态链接
        • 2.问题
        • 3.优点
        • 4.缺点
      • 2.静态链接
        • 1.用一个小故事理解静态链接
        • 2.问题
        • 3.优点
        • 4.缺点
        • 5.静态链接拷贝的是.so内部的代码吗?
    • 5.Linux下库的命名
      • 1.动态库
      • 2.静态库
    • 6.总结
  • 四、makefile(自动化构建工具)
    • 1.makefile原理
    • 2.makefile的语法
    • 3.如何确保为目标文件每次是否需要重新编译生成?
    • 4.makefile的推导规则
  • 五、gdb(调试器)
    • 1.背景知识
    • 2. 使用(指令)
      • 1.安装
      • 2.发布debug版本的文件
      • 3.相关的调试指令
      • 4.部分调试指令的演示
  • 六、Linux中文件的三个时间
    • 1.access
    • 2.modify
    • 3.change
  • 七、简单写一个倒计时
    • 1.缓冲区问题
    • 2.回车换行
    • 3.显示器为什么能显示各种符号?
    • 4.倒计时代码
  • 八、Linux下的第一个小程序——进度条
  • 总结


前言

Linux中的基础开发工具及其使用,包括yum(软件包管理器)、vim(编辑器)、gcc/g++(编译器)、makefile(项目自动化构建工具)、gdb(调试器)等。


一、yum(软件包管理器)

1.什么是软件包?

我们在Linux下安装一个软件通常是下载程序的源代码,继续编译得到它的可执行程序。但是这样做比较麻烦,因此有一些人将常用的一些软件提前编译好做成软件包(相当于windows下的软件安装包)放在服务器上,通过软件包管理器可以获得这个编译好的软件包,直接安装可执行程序。

2.下载软件包

在这里插入图片描述

1. 安装软件之前需要将软件的安装包下载下来

这一行为必须通过互联网;

2. 软件包并不在我们的本地电脑,那么软件包在哪里呢?

答案是在别人的电脑上(远端服务器上,云服务器);

3. 那么问题来了,我们的电脑如何得知要去哪里找软件安装包呢?(我的电脑怎么知道我要下载的软件安装包在那一台服务器上呢?)

用现实中的例子,根据对象的不同,查找软件安装包的方式也不同:
a.电脑:搜索软件官网
b.手机:手机的应用商店(当然,应用商店也只是手机上的一个app)
c**.Linux:软件包管理器(相当于应用商店)**

4.谁提供软件包?谁放在服务器?

(1)企业、组织、个人为了获得某种利益提供了软件包
(2)提供了软件包后,一般将他们放在那里?
a.电脑:软件官网
b.手机:手机应用商店——提供商的服务器

3.yum

yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat,Centos等发行版上。

1.验证主机网络

关于yum的所有操作必须保证主机(虚拟机)网络通畅,因此需要通过ping指令验证:

ping www.baidu.com

在这里插入图片描述

2.查看软件包

通过yum list命令可以罗列出当前公有那些软件包,因为软件包的数目会比较多,我们可以用grep命令筛选出我们所关注的软件包。

yum list | grep lrzsz

在这里插入图片描述

软件包名称:主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构。
"x86_64"后缀表示64位系统的安装包,“i686"后缀表示的是32位系统的安装包,选择安装包要与系统匹配。(操作系统的体系结构
"el7"表示操作系统发行版的版本。“el7”表示centos7/redhat7。“el6”表示centos6/redhat6。
base表示“软件源”的名称,类似于手机上的XXX应用商店。

3.安装软件

sudo yum install -y sl
  1. 需要sudo提权是因为软件将安装在特定的目录,目录需要权限,如果是root用户,安装就不需要加sudo。
  2. yum会自动查找需要下载的相关安装包,此时输入"y"确认安装(如果指令加上-y则无需确认)。
  3. 出现"complete",说明安装成功。
  4. 其他要安装的软件包,我们要根据自己的需求进行下载安装。

例子:第一个安装的软件lrzsz

该软件可以实现windows和Linux的交互,使windows机器于远端的Linux机器通过xshell传输文件,安装完毕后可以通过拖拽的方式将windows中的文件传给Linux。

4.卸载软件

sudo yum remove -y sl
  1. 需要sudo提权是因为软件将安装在特定的目录,目录需要权限,如果是root用户,安装就不需要加sudo。
  2. yum会自动查找需要卸载的相关安装包,此时输入"y"确认卸载(如果指令加上-y则无需确认)。
  3. 出现"complete",说明卸载成功。

5.扩展内容

1.查看yum源的配置文件

ls /etc/yum.repos.d

在这里插入图片描述

2.用其他的yum源替换我们自己云服务器的yum源配置。

1.备份原始的yum源(避免新的yum源有问题,同时导致不能返回原始yum源的情况)

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS.repo_tmp

2.下载阿里yum源配置文件

wget https://mirrors.aliyun.com/repo/Centos-7.repo

3.使用该yum源
将下载好的新yum源重命名为CentOS-Base.repo
当然如果使用的是云服务器就不需要更换yum源了(云服务器都是使用国内的镜像源)

3.非官方的软件集

官方软件集(centos、Ubuntu、kail等)中的软件都是经历长期使用确定稳定安全高效的,当然也存在非官方的软件集合(yum源一般称为epel)里面的软件都是还在试用的软件(有机会加入到官方)。
epel-release的安装(非官方扩展源)

yum install -y epel-release

如果在安装软件时,没有在官方软件集中找到官方的下载链接,则yum会自动去epel-release中查找。

二、vim(编辑器)

1.vim的介绍

vim是Linux下一种功能强大,有多种模式的编辑器。
vim有三种常用模式,分别是命令模式、插入模式、底行模式。

  • 命令模式:
    又叫做正常模式、普通模式、默认模式。进入vim后默认处于命令模式,可以转换为其他模式。可以控制屏幕光标的移动,字符、字或行的删除、移动、复制等。按ESC键即可从其他模式退出到命令模式。
  • 插入模式:
    只有在insert mode下才可以进行文字输入,该模式是我们使用频繁的编辑模式,可以对文件中的内容进行正常编辑(像记事本一样)。i即可进入
  • 底行模式:
    文件保存或退出,也可以进行文件替换(可以同时打开多个文件)、查找字符串、列出行号等操作。:(shift + ;)即可进入
    在这里插入图片描述

2.vim的基本操作

1.进入vim

在系统的提示符号输入vim及文件名称后,默认进入vim全屏幕编辑画面

$ vim test.c

在这里插入图片描述

2.正常模式的操作

1.正常模式切换到插入模式

输入 a:从光标当前位置开始输入文字;
输入 i:从光标的所在位置的下一个位置开始输入文字;
输入 o:在文章刚开始插入新的一行,即,从文首开始输入文字。
从插入模式返回正常模式,按Esc

2.从正常模式切换到底行模式

输入:
从底行模式返回正常模式,按Esc

3.移动光标

  1. [h] [j] [k] [l]分别控制光标左、下、上、右移动
  2. [G]光标移动到文本的末尾
  3. [gg]光标移动到文本开始
  4. [$]光标移动到光标所在行的行尾
  5. [^]光标移动到光标所在行的行首
  6. [n + shift + g]光标移动到第n行

4.删除

  1. [x]每按一次。删除光标位置的一个字符
  2. [n + x]删除光标位置起的n个字符
  3. [X]删除光标所在位置的前一个字符
  4. [n + X]删除光标位置的前n个字符
  5. [dd]删除光标所在行
  6. [n + dd]删除光标所在位置起的n行

4.复制

  1. [yy]复制光标所在行到缓冲区
  2. [n + yy]复制从光标所在行起的n行到缓冲区

5.粘贴

  1. [p]将缓冲区的内容粘贴到光标所在位置
  2. [yy + p]复制粘贴
  3. [dd + p]剪切

6.替换模式

  1. [r]替换光标所在位置的一个字符(支持nr,将光标所在位置起的n个字符转化为一个字符)
  2. [shift + ~]将光标所在位置的字母进行大小写转化(一直按着可以自动转换到这一行结束)
  3. [R]替换光标所到之处的字符,直到按下Esc

7. 撤销上一次操作

  1. 如果误执行了一个命令可以按下[u]回到上一个操作(将该命令撤销),按多次[u]可以执行多次撤销操作。
  2. [ctrl + r]撤销的恢复(相当于撤销撤销这个操作)

3.底行模式的操作

首先确定您已经处于底行模式。

1.行号

set nu/nonu

列出行号/取消行号

2.分屏

vs copy.c

同时打开多个文件(代码中的copy.c是文件名),但是只有一个光标。光标的意义在于选中的行或屏幕。
光标跨屏:

ctrl + ww

3.执行shell指令

底行模式中,不需要退出vim,只需要在指令前加上!,即可强制执行shell指令。

!gcc test.c-o test

在这里插入图片描述

!./test

在这里插入图片描述

3.底行替换

将要替换的命令替换为替换后的命令。

%/需要替换的命令/替换后的命令/g

在这里插入图片描述

4.保存和退出文件

wq

单独的w是保存文件,单独的q是退出文件,两个一起是保存并退出文件。
如果文件提示无法退出,可以在q之前加上!,强制退出。

3.vim的配置

没有进行配置的vim和记事本没有多大区别比较难使用,为了方便使用,我们要对vim进配置。
注意:vim的配置是一人一份的并不会互相影响,虽然大家用的是一个vim运行程序,但是大家的vim配置不同(每个成员在自己的家目录下有属于自己的vim配置)。
vim的配置是在家目录下的.vimrc文件中,可以在该文件中添加一系列的命令。因此vim的配置其实就是修改.vimrc文件。

三、gcc/g++(编译器)

1.编译链接的过程

在正式介绍编译器之前,我们先回顾一下编译链接的过程。
在这里插入图片描述

2.gcc/g++的使用

1.预处理

头文件展开、宏替换、条件编译、去掉注释。

gcc -E test.c -o test.i

从现在开始进行程序的翻译,直到预处理结束停下。
头文件展开:
在这里插入图片描述

去掉注释:在这里插入图片描述

2.编译

检查代码的规范性,以及是否存在语法错误等,确定无误后将代码编译为汇编语言。

gcc -S test.i -o test.s

从现在开始,进程程序的翻译工作,直到编译结束文件变成汇编后,就停下来。
在这里插入图片描述

3.汇编

将汇编语言转换为二进制语言(并非可执行程序,是二进制目标文件)

gcc -c test.s -o test.o

从现在开始,进行程序的翻译工作,做完汇编工作后,变成可重定向目标二进制文件,就停下来。
在这里插入图片描述
可以发现我们看不懂这些乱码,但是用命令od test.o就可以将它转化为我们可以看懂的01二进制文件
在这里插入图片描述

4.链接

链接的过程就是,将目标文件与标准库链接起来,形成一个可执行程序的过程。

gcc test.o -o test

链接的过程形成了可执行程序(test是我们自定义的可执行程序文件名,可以进行修改)
在这里插入图片描述
可以看到整个过程形成的所有的文件:
在这里插入图片描述

3.函数库

1.库函数

我们自己写的代码和库是两码事,我们自己写的程序中没有定义printf等函数的具体实现,且在预编译中包含的stdio.h中也只有这些函数的声明,只有在链接的时候该函数的实现才与我们的代码关联起来,那么这类函数是在哪里实现的呢?
答:这类函数都被实现到文件名为libc.so.6的文件中,在没有特别指向时,gcc会到系统默认的搜索路径/usi/lib下进行寻找。即,链接到libc.so.6库函数中去,这也是链接的作用,将库函数的实现与库函数的声明关联起来。
查看该文件:

ls /lib64/libc.so.6 -l

在这里插入图片描述

2.为什么要存在数据库?

为了让我们站在巨人的肩膀上,减少我们的开发成本。

4.静态链接和动态链接

gcc meytest.c -o mytest.s

Linux下形成一个可执行文件使用的链接默认动态链接。如果要求是静态链接,就必须在命令尾部加上 -static,如下:

gcc meytest.c -o mytest.s -static

1.动态链接

1.用一个小故事理解动态链接

从前,在XXX学校,有一个叫张三的学生,他每天的生活都很自律。每天都会严格执行自己的计划清单,清单内容:数学、语文、英语、上网、复习。他住在学校的宿舍里,身边有数学、语文、英语的学习资料,但是没有上网的工具。为了顺利执行计划,张三询问他的学长,学校附近是否存在网吧,学长告诉张三,出了学校北门往东走500米左右就到XXX网吧。因此张三先执行学习数学、语文、英语的计划,然后按照学长给他的地址到达XXX网吧进行上网,然后再回来复习今天的内容。
上面的故事可以参考下图进行理解。
在这里插入图片描述
如果将张三比作程序,则张三每日执行的计划清单就是程序员所写的代码,而其中上网这一项,则是程序要调用库函数。程序跳转到函数库中执行所需的库函数,执行完毕后再回到代码中继续向后执行。(这种调用库函数的方法称为动态链接)

2.问题

  1. 如果网吧升级或者被关闭会影响张三上网吗?
    会影响的,如果网吧要升级,它必然一段时间不开门,导致张三无法上网。更不用说是被关闭。
  2. 这样做耗费张三的时间吗?
    当然耗费,张三前往网吧上网,以及上网结束回到学校都要耗费时间的。

3.优点

动态链接形成的可执行的程序小。
节省资源——内存、磁盘。
方便下载。

4.缺点

受库的升级或者被删除的影响。

2.静态链接

1.用一个小故事理解静态链接

前几日由于受到学校的举报,学校附近的网吧都被关闭了。好在,张三的父母比较开明,也很信任自己的孩子,就给张三买下了张三常在网吧中学习的那台机子。在这之后,张三执行每日计划就不需要跑去外面的网吧,他在宿舍中就可以执行上网这一项内容,然后正常执行每日计划。
在这里插入图片描述
程序将所需的库函数从函数库中拷贝了一份,然后就不需要再进行跳转到函数库中执行库函数了。(这种调用库函数的方法称为静态链接)

2.问题

  1. 如果网吧升级或者被关闭会影响张三上网吗?
    不影响,此时张三所需要进行上网的工具电脑,已经在张三身边,因此无论是网吧升级导致定制营业还是网吧彻底关闭都不会影响张三上网。
  2. 这样做耗费张三的时间吗?
    不耗费,电脑就在张三手边,和张三的语文英语等学习资料一样需要就可以拿来用,不需要在路上耗费时间。

3.优点

不受库的升级或者被删除的影响。

4.缺点

形成的可执行程序体积太大。——网络、磁盘、内存。
同一个库函数可能会有多个C程序调用,此时使用静态链接就会导致代码冗余的问题。

5.静态链接拷贝的是.so内部的代码吗?

不是,如果要静态链接的话,系统中必须存在.a结尾的静态库。因为,动态链接找动态库,静态链接找静态库。

5.Linux下库的命名

去掉前缀lib,去掉后缀.so 剩下的就是库名称。动态库的后缀是.so 静态库的后缀是.s
eg: libC.so =》 C标准库

1.动态库

libXXXX.so

  1. 一般而言,系统会自带动态库(为什么?
    因为系统的运行需要用到动态库。
  2. 敢不敢删除系统中的C动态库?
    不敢。用C动态库的程序非常多,库只有一份,所有用C语言编写的程序不会出现重复的库代码! =》 将动态库又称为共享库。
    如果我们下载了一个用C编写的程序,还需要额外下载C标准库吗?不需要,它会自带。

2.静态库

libYYYY.a

  1. 静态库如果不存在,则需要自己安装(如果要生成静态链接,需要自己安装C/C++静态库)。 如果系统中只存在静态库,则默认的链接就是静态链接
  2. 敢不敢删除系统中的C动态库?
    原因同动态库。

6.总结

系统本身为了支持我们编程,给我们的程序提供了什么呢?
系统给我们提供的标准库.h(告诉我们怎么用),标准的动静态库.so/.a(告诉我们,方法实现我有,有需要就来找我)。
我的代码 + 库的代码 = 可执行程序。
上面的内容只在Linux下有效吗?windows下原理是一样的。(windows中静态库.dll,静态库.lib)同时windows下默认的默认链接也是动态链接。

四、makefile(自动化构建工具)

makefile是一个文件,make是一个命令(执行makefile中的命令)。

1.makefile原理

makefile存在的意义,是为了构建项目(做的一件事情),做一件事情需要:a.依赖关系,b.依赖方法
依赖关系,用哪个源文件生成目标文件;
依赖方法,如何用源文件生成目标文件。
例子:你去向你爸要生活费,会说爸,给我点生活费。
依赖关系:你和你爸是父子关系;
依赖方法:你爸给你打钱。
因此,makefile内部要保存大量的依赖关系和依赖方法。
例子:
在这里插入图片描述
第一行是依赖关系(mytest文件的形成依赖mytest.c文件),第二行是依赖方法(mytest.c文件经过编译形成mytest文件)
注意:第二行的最开始空白是一个Tab而不是几个空格。

2.makefile的语法

make会执行第一个目标文件的生成语句
make 目标文件文件名 会执行指定的文件语句。

3.如何确保为目标文件每次是否需要重新编译生成?

根据目标文件和它依赖的文件的修改时间差(关于时间的具体内容参见下文):如果它所依赖的文件修改时间在目标文件修改时间之前,则不需要再进行重新生成目标文件;如果它所依赖的文件修改时间在目标文件修改时间之后,则需要再重新生成目标文件。
一旦目标文件被设置为伪目标文件,即用.PHONY:进行修饰,则目标文件每一次都将无视修改时间,即必须重新生成。

4.makefile的推导规则

如果要将上面例子的每个步骤都进行执行的话,则需要如下图的代码:
在这里插入图片描述
make在缺省情况下(不指定目标文件),会只执行第一个目标文件的代码。如果第一个目标文件所依赖的文件还没有生成,就会去生成所依赖的文件(这一过程类似栈的规则:先进后出)。

五、gdb(调试器)

1.背景知识

  1. 程序的发布方式有两种:debug版本和release版本。

debug版本方便程序员对程序进行调试,而release版本将很多可以调试的地方优化了(例如:assert会在release版本下失效)。
release的大小也比debug大。
在这里插入图片描述

  1. Linux gcc/g++出来的二进制程序默认是以release版本发布的。
  2. 为了能对程序进行调试,我们要将程序以debug版本进行发布,需要在源代码生成二进制程序的时候加上-g选项。

2. 使用(指令)

1.安装

sudo yum install -y gdb

2.发布debug版本的文件

gcc -g test.c -o test_g

默认情况下gdb无法对当前发布的版本(默认为release版本)进行调试,要发布debug版本才行。

3.相关的调试指令

发布debug版本的文件,使用调试指令进行调试。

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb

4.部分调试指令的演示

注意:gdb中如果本次没有输入指令,则默认同上一次的指令相同,直接进行执行(直接enter)。

  1. l
    显示代码(list的简称,l 0从第一行开始显示,继续enter会继续显示剩余的代码)
    在这里插入图片描述
  2. b
    打断点(b 是break的简称,即break后跟要打断点的代码行即可)
    在这里插入图片描述
  3. info b
    查看断点
    在这里插入图片描述
  4. d +断点编号
    取消断点
    在这里插入图片描述
  5. r
    调试运行,到第一个断点处停下(run的简称)
    在这里插入图片描述
  6. n
    逐过程调试(next的简称,该调试方式不进入函数)
    在这里插入图片描述
  7. s
    逐语句调试(step的简称,该调试方式进入函数)
    在这里插入图片描述
  8. bt
    显示函数调用堆栈
    在这里插入图片描述
  9. fin
    直接将函数运行完(finish的简称)
  10. display
    常显示变量(类似于vs2013中的监视)
    test.c的代码:在这里插入图片描述
    调试现象:
    在这里插入图片描述

六、Linux中文件的三个时间

在这里插入图片描述

1.access

被访问的时间,原本的规则是每次访问时间都会被改变,但是由于一旦文件被修改,就意味着它被访问了,而它被访问了却不一定被需修改,为了避免修改频率太快,导致资源浪费(访问时间用处也不大),因此是在一段时间里,多次访问才会更新时间。(不一定是最新时间)

2.modify

文件内容的修改时间(最新时间)

3.change

文件属性的修改时间(最新时间),文件内容发生变化会导致文件属性发生修改,文件属性包括文件内容。

七、简单写一个倒计时

1.缓冲区问题

看看如下代码
在这里插入图片描述
先sleep还是先printf?
根据程序运行的顺序,先printf再sleep。
但是,通过运行我们发现是先sleep了,之后才打印出来了。
说明是先将内容放在缓冲区,sleep后再将缓冲区内容显示在屏幕上。
但是,如果在printf中增加\n,则会及时的显示内容。
因此,我们明白printf的内容是先存放在缓冲区里,等到缓冲区刷新时才会显示到显示器上。

2.回车换行

一般而言:
\r换行是指换到下一行
\n回车指回到当前行的最开始
但是在语言层面
\n就是回车换行

3.显示器为什么能显示各种符号?

显示器面板上有各种像素点,凡是显示到显示器上的都是字符(显示器不认识字符的含义,只是根据用户的要求进行显示一个一个的字符)

4.倒计时代码

代码如下,大家可以自行运行尝试。
在这里插入图片描述

注意:

  1. 用\r回到当前行的最开始,用新的值覆盖旧的值就能实现动态倒计时的效果;
  2. 因为\r不会主动刷新缓冲区,导致缓冲区的内容无法显示在显示器上,因此每一次都要用fflush函数对缓冲区进行刷新;
  3. 因为cnt从两位数变为一位数的,因此我们为了将它最初的两位数都可以进行覆盖,要对打印的格式进行控制。

八、Linux下的第一个小程序——进度条

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

在这里插入图片描述
如果需要源码,可以参考该网址(我的gitee):
实现一个进度条源代码


总结

以上就是今天要讲的内容,本文介绍了Linux中的基础开发工具的相关知识。本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

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

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

相关文章

npm 配置双因素身份验证

目录 1、关于双因素身份验证 2、NPM上的双因素身份验证 2.1 授权和写入 2.2 仅限授权 3、先决条件 4、从网站配置2FA 4.1 启用2FA 4.2 为写入禁用2FA 4.3 禁用2FA 5、从命令行配置2FA 5.1 从命令行启用2FA 5.2 从命令行发送一次性密码 5.3 从命令行删除2FA 6、配…

chatgpt赋能Python-python3_8怎么安装库

Python 3.8怎么安装库 - 一个简单易懂的指南 如果你正在学习Python编程,或者想要在你的项目中使用Python 3.8,那么你可能需要安装一些Python库。Python库是一些预定义的Python模块,它们可以帮助你更快速地完成你的项目。在这篇文章中&#x…

chatgpt赋能Python-python3_9_6怎么用

Python 3.9.6简介 Python 3.9.6是2021年6月28日发布的Python编程语言的最新版本,它提供了一些有用的新功能和改进,包括优化的解释器性能和可变构造体。它是一种功能强大的编程语言,既易于学习又易于使用,非常适用于开发Web应用程…

059:cesium设置条纹条带Stripe材质

第059个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置条纹条带材质,请参考源代码,了解StripeMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共91行)相关API参考:专栏目标…

机器学习——感知机

本章节主要介绍感知机的基础知识,虽然在目前的机器学习范围内,感知机已经不怎么使用,但是通过对感知机的学习可以更好的了解以后的线性模型等相关知识。 同时读者可以点击链接:机器学习-目录_欲游山河十万里的博客-CSDN博客 学习完…

Flutter 笔记 | Flutter 核心原理(一)架构和生命周期

Flutter 架构 简单来讲,Flutter 从上到下可以分为三层:框架层、引擎层和嵌入层,下面我们分别介绍: 1. 框架层 Flutter Framework,即框架层。这是一个纯 Dart实现的 SDK,它实现了一套基础库,自…

蓝牙 a2dp 知识点

1 不同的场景支持 当手机与耳机连接时,会协商音频编解码器、音频质量、音频延迟。(可以决定是游戏模式还是音乐模式) 2 音量调整 手机下发音乐数据的同时,还会下发音量值。耳机根据这个音量值,调整音乐数据到耳机实…

微软 | 把local小模型当作大语言模型的插件?

一、概述 title:Small Models are Valuable Plug-ins for Large Language Models 论文地址:https://arxiv.org/abs/2305.08848 代码:https://github.com/JetRunner/SuperICL 1.1 Motivation 大语言模型想GPT-3和GPT-4权重没有开放出来&a…

实验 2:树形数据结构的实现与应用

东莞理工学院的同学可以借鉴,请勿抄袭 1.实验目的 通过实验达到: 理解和掌握树及二叉树的基本概念; 理解和掌握二叉树的顺序存储结构、链式存储结构; 理解和掌握采用二叉链式存储结构下二叉树的各种遍历操作的思想及 其应用&a…

详解Jetpack Compose的标准布局

前言 Compose是一个声明式UI系统,其中,我们用一组函数来声明UI,并且一个Compose函数可以嵌套另一个Compose函数,并以树的结构来构造所需要的UI。 在Compose中,我们称该树为UI 图,当UI需要改变的时候会刷新…

UML类图与设计模式/原则

目录 类之间的关系依赖泛化(继承)实现关联聚合组合 设计模式的七大原则设计模式单例工厂模式原型模式(深/浅拷贝)建造者模式适配器模式桥接模式装饰者模式组合模式外观模式享元模式代理模式模板方法模式命令模式访问者模式迭代器模式观察者模式中介者模式…

chatgpt赋能Python-python3_8_5安装后怎么打开

Python3.8.5安装后怎么打开:简易步骤指南 Python是一种高级编程语言,被广泛用于数据分析、机器学习、自动化、网络编程等多个方面。Python语言优雅简洁,易于上手,是编程初学者的最佳入门语言之一。本文将介绍Python3.8.5版本的安…

C++ 红黑树(更新中)

前言 上篇博客学习了平衡二叉搜索树(AVLTree),了解到AVL树的性质,二叉搜索树因为其独特的结构,查找、插入和删除在平均和最坏情况下都是O(logn)。AVL树的效率就是高在这个地方。 但是在AVL树中插入或者删除结点,使得高度差的绝对…

学系统集成项目管理工程师(中项)系列22c_信息化知识(下)

1. 新一代信息技术对产业的推动 1.1. 加快建设宽带、泛在、融合、安全的信息网络基础设施,推动新一代移动通信、下一代互联网核心设备和智能终端的研发及产业化,加快推进三网融合,促进物联网、云计算的研发和示范应用 1.2. 大数据 1.2.1. …

申请GPT-4插件,等待GPT-4插件候补全过程

前言 GPT4相信大家都知道它的升级是带来更多惊喜的,目前GPT4已经推出了网页和插件功能,这些插件是专门为语言模型设计的工具。插件可以帮助 ChatGPT 访问最新信息、运行计算或使用第三方服务。写文记录一下,如果你现正好有需要GPT-4 插件的需…

基于springboot就业信息管理系统

开发技术与环境配置 以Java语言为开发工具,利用了当前先进的springboot框架,以MyEclipse10为系统开发工具,MySQL为后台数据库,开发的一个就业信息管理系统。 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring…

chatgpt赋能Python-python3_8怎么打开

Python 3.8:如何下载和打开 Python 3.8是一种高级编程语言,被广泛应用于人工智能、数据分析和网络编程等领域。本文将介绍如何下载和打开Python 3.8以及其优点和用途。 下载Python 3.8 Python 3.8的下载地址为官方网站。根据不同操作系统的需求&#…

系统清理优化工具:CCleaner

哈喽,大家好。今天带各位小伙伴们学习一款系统清理优化工具——CCleaner。 CCleaner是一款系统优化和隐私保护工具。它可以用来清除Windows系统不再使用的垃圾文件,以腾出更多硬盘空间。也可以清除使用者的上网记录。它的体积小,运行速度快&…

java+springboot高校校友校园信息管理系统

本高校校友信息管理系统使用Web开发,运行在Internet环境之上,系统的后台编程语言使用JAVA,数据库使用MySQL。完成了两个用户角色的功能,管理员管理所有信息,前台学生用户登录后查看公告,在线捐赠申请&#…

docker是怎么决定容器内容存储到哪个目录的?(存储驱动决定的)(乱七八糟的)

文章目录 docker是怎么决定容器内容存储到哪个目录的?docker对我/var这个目录有没有什么要求,比如要求它的文件系统是指定的类型如果我Docker的默认存储驱动是overlay2,但是我/var目录的文件系统不是overlay2,这没影响吗&#xff…