什么是软件包?
在
Linux
下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows
上的安装程序)放在一个服务器(阿里云、腾讯云、百度云等等)上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App
” 和 “应用商店” 这样的关系。
yum(Yellow dog Updater, Modified)
是Linux
下非常常用的一种包管理器。主要应用在Fedora
,RedHat
,Centos
等发行版上。
查看yum
的周边 — yum
的整个生态的问题
这里有三个问题:
1、yum
如何得知目标服务器的地址和下载链接?
答:在yum
下存在一个目录/etc/yum.repos.d/
,这个目录里面有一个文件CentOS-Base.repo
,这个文件里面有这目标服务器服务器的地址和下载链接。
2、云服务谁提供的?
答:因为这个Linux
是国外团队研发出来的,所以Linux
的资源都在国外。但是我们如果每次下载这个资源都需要访问国外的网络(俗称),那么速度会很慢,因此国内很多公司会把这个国外的资源镜像过来供国人使用,并且在国内访问速度更快,使用更加便捷。比较出名的是网易的163、清华大学、阿里云的镜像网站。
3、谁提供软件?
答:Linux
的软件主要来源于各种发行版。这些发行版可以是官方维护的,如Ubuntu
背后的Canonical
,他们有一个团队来维护核心的软件包,如Linux
内核、桌面环境以及常用的各类软件等。同时,也有社区维护的发行版,比如Fedora
上的RPM Fusion
。社区维护那些官方软件源不包含的软件。这些软件可供于分享和交流、建立社区、创造价值、学习和教育。
关于 rzsz
这个工具用于
windows
机器和远端的Linux
机器通过XShell
传输文件。安装完毕之后可以通过拖拽的方式将文件上传过去
注意事项
关于
yum
的所有操作必须保证主机(虚拟机)网络畅通!!!可以通过ping
指令验证
ping www.baidu.com
按下
ctrl+C
停止
查看软件包
通过
yum list
命令可以罗列出当前一共有哪些软件包。由于包的数目可能非常之多, 这里我们需要使用grep
命令只筛选出我们关注的包。例如:
yum list | grep lrzsz
- 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构。
- “x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配。
- “el7” 表示操作系统发行版的版本。 “el7” 表示的是 centos7/redhat7。 “el6” 表示 centos6/redhat6。
- 最后一列, os 表示的是 “操作系统” 的名称。
如何安装软件
sudo yum install 软件名称
yum install 软件名称
yum
会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装。出现 “complete” 字样, 说明安装完成。
yum
安装软件只能一个装完了再装另一个。正在yum
安装一个软件的过程中, 如果再尝试用yum
安装另外一个软件,yum
会报错。
如何删除软件
sudo yum remove 软件名称
yum remove 软件名称
注意这里是
remove
,不是uninstall
。
vim
有多种模式,目前我们仅需要掌握三种,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,
shift+:
即可进入该模式。要查看你的所有模式:打开vim
,底行模式直接输入:help vim-modes
。
进入vim
,在系统提示符号输入vim
及文件名称后,就进入vim
全屏幕编辑画面。
vim test.c
这里我们注意到进入到
vim
的时候是[NORMAL模式](正常模式/命令模式)。如需要输入信息,需要切换到[插入模式](INSERT模式)。
[正常模式] 切换至 [插入模式],先按下键盘左上角esc(以防万一,无脑esc就行了)。下面随便按下键盘的三个字母的其中一个:
输入
a
输入
i
输入
o
[插入模式] 切换至 [正常模式]
目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。
[正常模式] 切换至 [末行模式]
输入「shift + ;」, 其实就是输入「:」
退出vim
及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:
:w — 保存当前文件
:wq — 保存当前文件并退出
vim
:wq! — 保存当前文件并强制退出
vim
:q! — 不存盘强制退出
vim
移动光标
vim
可以直接用键盘上的光标来上下左右移动,但正规的vim
是用小写英文字母「h」(巧记:四个字母的最左边)、「j」(巧记:jump,往下跳)、「k」(巧记:king,王,高高在上)、「l」(巧记:四个字母的最右边),分别控制光标左、下、上、右移一格- 按「G」 (shift+g):移动到文章的最后
- 按「 $ 」 (shift+4):移动到光标所在行的“行尾”
- 按「^」 (shift+6):移动到光标所在行的“行首”
- 按「w」:光标跳到下个字的开头
- 按「e」:光标跳到下个字的字尾
- 按「b」:光标回到上个字的开头
- 按「#l」:光标移到该行的第#个位置,如:5l,56l
- 按[gg]:进入到文本开始
- 按「ctrl」+「b」:屏幕往“后”移动一页
- 按「ctrl」+「f」:屏幕往“前”移动一页
- 按「ctrl」+「u」:屏幕往“后”移动半页
- 按「ctrl」+「d」:屏幕往“前”移动半页
删除文字
- 「x」:每按一次,删除光标所在位置的一个字符
- 「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
- 「X」 (shift+x):大写的X,每按一次,删除光标所在位置的“前面”一个字符
- 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
- 「dd」:删除光标所在行(带剪切功能),可以配合p使用
- 「#dd」:从光标所在行开始删除#行
复制粘贴
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。
注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
替换
「r」:替换光标所在处的字符。
「R」(shift+r):替换光标所到之处的字符,直到按下「ESC」键为止。
撤销上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
「ctrl + r」(注意不是shift+r): 撤销的恢复。
跳至指定的行
- 「ctrl」+「g」列出光标所在行的行号。
- 「#G」:例如,「12G」,表示移动光标至文章的第
12
行行首。
在vim中,可以通过以下步骤选中多行进行注释:
- 进入命令行模式,按
ctrl + v
进入 visual block模式。- 按
j
或k
键选中需要注释的多行。- 按大写字母
I
,然后插入注释符,例如//
。- 按
esc
键就会全部注释了。取消多行注释也是类似的操作:
- 进入命令行模式,按
ctrl + v
进入 visual block模式。- 按小写字母
l
横向选中列的个数,例如需要选中2列。- 按
j
或k
键选中注释符号。- 按
d
键就可全部取消注释。
在vim中,选中多行进行缩进的快捷键有以下两种方法:
方法一:
- 进入命令行模式,按
ctrl + v
进入列编辑模式。- 按
shift + v
选中需要缩进的行。- 选中后,使用`=“进行缩进或者使用“<” “>”进行缩进。
方法二:
- 进入命令行模式,按
ctrl + v
进入列编辑模式。- 按
shift + v
选中需要缩进的行。- 选中后,使用快捷键
command(花键)+]
进行右缩进,同理,使用快捷键command(花键)+[
进行左缩进。以上就是在vim中选中多行进行缩进的两种方法。
在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。
列出行号
跳到文件中的某一行
查找字符
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
问题:/ 和 ? 查找有和区别 ? 操作实验一下
答:/从前往后查找,? 从后往前查找。
保存文件
- 「w」: 在冒号输入字母「w」就可以将文件保存起来。
退出vim
- 「q」:按「q」就是退出,如果无法离开
vim
,可以在「q」后跟一个「!」强制离开vim
。- 「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
多窗口模式
末行模式输入
vs 文件
,如vs code.c
。这时候如果你想切换光标到另一个文件,先esc,再
ctrl+ww
,这样光标就移动到另一个文件了。
配置文件的位置
常用配置选项,用来测试
- 设置语法高亮: syntax on
- 显示行号: set nu
- 设置缩进的空格数为4: set shiftwidth=4
在vim .vimrc编辑后下列内容后保存退出(底行模式输入:wq)。
代码运行流程:
预处理(进行宏替换)
编译(生成汇编)
汇编(生成机器可识别代码)
链接(生成可执行文件或库文件)
格式:
gcc [选项] 要编译的文件 [选项] [目标文件]
预处理(进行宏替换)
编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例:
gcc –S test.i –o test.s
汇编(生成机器可识别代码)
链接(生成可执行文件或库文件)
运行可执行文件
- 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
- 其实是系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
静态库(或称静态链接库)的名字通常以.a为后缀,它是一个外部函数与变量的集合体。在编译期间,编译器与连接器会将静态库集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。这个可执行文件中包含了库代码的一份完整拷贝。优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。缺点是被多次使用时会有多份冗余拷贝。
动态库(或称动态链接库)的名字通常以.so为后缀,它在编译的时候并没有被编译进目标代码中。程序执行到相关函数时才会调用该函数库里的相应函数,因此动态库所产生的可执行文件比较小。由于函数库没有被整合进程序,而是程序运行时动态地申请并调用,所以程序的运行环境中必须提供相应的库。动态库的改变并不影响程序,所以动态库的升级/更新比较方便。
gcc默认生成的二进制程序,是动态链接的,这点可以通过
file
命令验证。在Linux系统中,库文件通常存放在/usr/lib或/lib目录下。
回到根目录
/
,输入cd lib64/
,再ll
,再此目录下可以看到文件。
gcc选项记忆
ESc
:键盘左上角
iso
:镜像文件
make
是一个用于自动化项目构建的工具(命令),通常用于编译和链接源代码文件以生成可执行文件或库。Makefile
是 make
工具使用的配置文件,它定义了项目中文件之间的依赖关系和构建规则。通过 make
和 Makefile
,可以确保只有在需要时才重新构建项目的组件,从而提高开发效率。
以下是关于 make
和 Makefile
的基本概念:
make
命令:make
命令由用户执行,它根据 Makefile
文件中定义的规则来构建项目。默认情况下,make
会在当前目录中查找名为 Makefile
或 makefile
的文件,但也可以通过使用 -f
选项指定其他 Makefile
文件的名称。
Makefile
文件:Makefile
文件是一个文本文件,它包含了一组规则和目标。每个规则定义了一个或多个目标文件,以及构建这些目标文件所需的依赖文件和构建命令。规则通常遵循以下格式:
target: dependencies
command
target
:表示需要构建的目标文件。dependencies
:表示构建目标文件所需要的依赖文件。command
:表示构建目标文件的命令。例如:
my_program: main.c utils.c
gcc -o my_program main.c utils.c
在这个示例中,my_program
是目标文件,它依赖于 main.c
和 utils.c
,构建命令是使用 gcc
编译这些源文件以生成可执行文件。
依赖关系:Makefile
中的依赖关系表示了目标文件和依赖文件之间的关系。如果依赖文件发生更改,或者目标文件不存在,make
将执行规则中的构建命令,以确保目标文件是最新的。
- 上面的文件 test ,它依赖 test.o
- test.o , 它依赖 test.s
- test.s , 它依赖 test.i
- test.i , 它依赖 test.c
自动化构建:make
工具的一个主要优势是它能够自动检测哪些文件需要重新构建,以减少不必要的编译和链接操作。它只会重新构建已更改或丢失的文件,而不是整个项目。
变量和函数:Makefile
支持变量和函数,可以用于简化规则的定义和提高可维护性。可以在 Makefile
中定义变量,然后在规则中引用这些变量。例如:
CC = gcc
CFLAGS = -Wall -O2
my_program: main.c utils.c
$(CC) $(CFLAGS) -o my_program main.c utils.c
在这个示例中,CC
和 CFLAGS
是变量,它们用于存储编译器和编译选项,从而使 Makefile
更具灵活性。
make
和Makefile
是在Unix/Linux开发中非常有用的工具,它们有助于自动化和简化项目的构建过程。通过定义清晰的规则和依赖关系,可以更有效地管理和维护项目的构建过程。
make clean
和 .PHONY
是与 make
和 Makefile
相关的两个重要概念。
make clean
:
make clean
是一种常见的 make
命令,通常用于清理项目目录,删除生成的文件和临时文件。在 Makefile
中,可以定义一个名为 “clean” 的伪目标(phony target),并在其中列出需要删除的文件或目录。这样,当运行 make clean
时,make
将执行清理操作。
以下是一个示例 Makefile
中的 clean
规则:
clean:
rm -f *.o my_program
在这个示例中,clean
是一个伪目标,它没有实际的文件依赖,但当运行 make clean
时,将执行 rm -f *.o my_program
命令,以删除所有 .o
文件和可执行文件 my_program
。
.PHONY
:
.PHONY
是一个特殊的目标,用于告诉 make
哪些目标是伪目标(不表示实际的文件),以防止 make
误解这些目标。通常,伪目标在 Makefile
中不会表示实际的文件,而是用于执行特定的操作或任务(比如clean清理数据)。
通过使用 .PHONY
,您可以明确告诉 make
哪些目标是伪目标。例如:
.PHONY: clean
clean:
rm -f *.o my_program
在这个示例中,.PHONY: clean
表示 “clean” 是一个伪目标。这有助于避免与同名的实际文件或目录发生冲突,并确保 make clean
始终执行 clean
规则。
鉴于之前的make命令在编译了一次后,在没修改文件的基础上再make是不会执行的。如果想要再执行的时候可以执行,这里就可以用到这个.PHONY(把各文件设置为伪目标)。
这样就可以多次执行make命令了。
伪对象的作用有两个
使目标对象无论如何都要重新生成。
并不生成目标文件,而是为了执行一些指令。
总之,make clean
是用于清理项目目录的常见 make
命令,而 .PHONY
用于标记伪目标,以确保 make
正确地处理这些目标。这两者一起使用可以帮助您更好地管理项目的构建和清理操作。
回车:回车符(ASCII码为13,表示为\r
)将光标移到当前行的开头,允许您在同一行上覆盖已经存在的文本。在Unix和Linux系统中,回车通常不用于文本文件中的文本换行。
换行:换行符(ASCII码为10,表示为\n
)将光标移动到下一行,用于分隔文本的不同行。在Unix和Linux系统中,文本文件的行通常以换行符来分隔。
Linux的行缓冲是一种数据传输模式,它在读取和写入文本数据时按行进行操作。具体来说,数据将被分成一行一行,并在一行结束后才会被处理。这通常用于标准输入和标准输出,意味着用户在终端上输入的命令和程序的输出将在一行结束时才被处理。如果需要实时处理数据,可以选择禁用行缓冲,这样数据将更快地传输(也可以使用**
fflush(stdout)
**)。禁用行缓冲:有时,您可能希望禁用行缓冲,以便实时地处理数据。您可以使用标准C库中的
setbuf
函数或setvbuf
函数,或者使用Unix系统调用setvbuf
来更改缓冲模式。例如,以下示例禁用了标准输出的缓冲:setbuf(stdout, NULL); // 禁用标准输出的缓冲
#include
int main(){
printf("hhaaaaaahhhhhhaahah\r");
//fflush(stdout);
sleep(3);
printf("\n");
return 0;
}
#include
int main(){
printf("hhaaaaaahhhhhhaahah\r");
fflush(stdout);
sleep(3);
printf("\n");
return 0;
}
main.c
文件:
#include
#include
#include
int main()
{
int i = 0;
char bar[101];
memset(bar, 0 ,sizeof(bar));
const char *lable="|/-\\";
while(i <= 100 ){
printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
fflush(stdout);
bar[i++] = '#';
usleep(100000);
}
printf("\n");
return 0;
}
运行结果:
processbar.h
文件:
#include
#include
#include
#include
//函数指针
typedef void(*callback_t)(double);
//进度条
void process(double rt);
processbar.c
文件:
#include "processbar.h"
const char *lable="|/-\\";
void process(double rt){
static int num = 0;
static char bar[101] = {0};
printf("[\033[0;32m%-100s\033[0m]][%5.1f%%][%c]\r", bar, rt, lable[num%4]); ++num;
fflush(stdout);
bar[(int)rt] = '#';
if((int)rt == 100) printf("\n");
}
main.c
文件:
void downlode(callback_t cb) {
srand(time(NULL) ^ 1023);
long total = FILESIZE;
while (total) {
usleep(100000);//下载动作
long one = rand() % (1024 * 1024 * 5);
total -= one;
if (total < 0) total = 0;
//当前进度
double rate = ((FILESIZE - total) * 1.0) * 100 / FILESIZE;
// printf("%.1f\n", rate);
cb(rate);
}
}
int main() {
downlode(process);
return 0;
}
运行结果:
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
退出: ctrl + d
或 quit
调试命令:
r:运行起来
list/l 行号:显示指定行之后的代码(gdb自动记录最近一条指令)
b 行号/函数名/file:行号:堆指定位置打断点
info b:查看我们所打的断点
d 断点编号:删除断点
disable/enable 断点编号:使能(禁用/开启)断点,注意这里编号是info b时候显示的编号
n:逐语句 – F10
s:逐过程 – F11
p:显示变量的内容和地址
display 变量名/取地址:常显示变量的内容或者地址
undisplay 编号:取消常显示变量的内容或者地址,注意这里是编号,这个编号是在display里面显示的编号
c:从一个断点运行到下一个断点(可用于问题范围查找)
finish:将一个函数运行结束,就停下来(可用于问题范围查找)
until:在一个范围内,直接运行到指定行(可用于问题范围查找),不能跳过函数调用,一般用于跳过循环
bt:查看调用堆栈
set var name=value:修改一个变量的内容(不用改代码,可用于多分支测试)
Makefile
文件内容:
test_gdb:test_gdb.c
gcc -o $@ $^ -g
.PHONY:clean
clean:
rm -f test_gdb
test_gdb.c
文件内容:
#include
int Sum(int n){
int i = 1;
int sum = 0;
for(; i<=n; ++i){
sum += i;
}
return sum;
}
int main(){
int result = Sum(100);
printf("result = %d\n",result);
return 0;
}
测试调试功能:
那么好,Linux开发工具就到这里,如果你对Linux和C++也感兴趣的话,可以看看我的主页哦。下面是我的github主页,里面记录了我的学习代码和leetcode的一些题的题解,有兴趣的可以看看。
Xpccccc的github主页