网站不备案可以登录吗,网店运营与推广,全球顶尖设计网站,制作网页网站公司目录 什么是软件包
Linux 软件包管理器 apt
认识apt
查找软件包
安装软件
如何实现本地机器和云服务器之间的文件互传
卸载软件
Linux编辑器 - vim
vim的基本概念
vim下各模式的切换
vim命令模式下各指令汇总
vim底行模式个指令汇总
Linux编译器 - gcc/g
gcc/g的作…目录 什么是软件包
Linux 软件包管理器 apt
认识apt
查找软件包
安装软件
如何实现本地机器和云服务器之间的文件互传
卸载软件
Linux编辑器 - vim
vim的基本概念
vim下各模式的切换
vim命令模式下各指令汇总
vim底行模式个指令汇总
Linux编译器 - gcc/g
gcc/g的作用
预处理 (进行宏替换)
编译生成机器可识别代码
汇编生成机器可识别代码
连接生成可执行文件或库文件
在这里涉及到一个重要的概念:函数库
函数库一般分为静态库和动态库两种
Linux调试器-gdb
gdb命令汇总
Linux项目自动化构建工具-make/Makefile
make/Makefile的重要性
依赖关系和依赖方法
项目清理
Linux第一个小程序 - 进度条
进度条代码及效果展示 什么是软件包
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
软件包和软件包管理器, 就好比 App 和 应用商店 这样的关系.
Linux 软件包管理器 apt
在linux下安装软件的方式大概有以下三种
1下载到程序的源代码自行进行编译得到可执行程序
2获取rpm安装包通过rpm命令进行安装为解决安装包的依赖关系
3通过apt进行安装软件经常使用的方式
认识apt
aptAdvanced Package Tool是Linux下非常常用的一种包管理器. 主要用于在 Ubuntu 、 Debian 和相关 Linux 发行版上 注意一个服务器同一时刻只允许一个apt进行安装不能在同一时刻安装多个软件
因为apt是从服务器上下载RPM包所以在下载时必须联网可以通过ping指令指令判断当前云服务器是否联网 查找软件包
使用apt list命令它会罗列出可以下载的所有软件 这里我们以查找lrzsz为例
lrzsz可以将Windows当中的文件上传到Linux中也可以将LInux当中的文件下载到Windows中实现云服务器和本地机器之间进行学习胡川
使用apt list | grep lrzsz来得到lrasz软件信息
由于包的数量太多所以我们可以使用grep指令筛选出我们所关注的包这里我们以lrzsz为例 此时就会显示与lrasz相关的软件包
在ubantu上这里会报错apt 没有稳定的 CLI 接口。在脚本中谨慎使用。
安装软件
指令sudo apt install 软件名
apt会自动找到都有那些软件包需要下载这时候敲 “y” 确认安装
注意事项
1安装软件时由于需要想系统目录中写入内容一般需要sudo或者切换到root账户下才能完成
2yum安装软件只能一个一个安装正在使用apt安装一个软件的过程中如果再尝试安装另一个软件apt会报错
如何实现本地机器和云服务器之间的文件互传
如何已经安装了lrzsz这里就顺便说一下lrzsz如何使用
指令: rz -E
通过该指令可选择需要从本地机器上传到云服务器的文件 指令sz 文件名
该指令可以将云服务器上的文件下载到本地机器的指定文件夹 卸载软件
指令sudo apt remove 软件名
apt会自动卸载该软件这时候敲“y”确认卸载
注意以上卸载安装指令在软件名前加上 -y 的意思是不需要询问直接卸载
Linux编辑器 - vim
vim的基本概念
vim在我们做开发的时候主要解决我们编写代码的问题本质上是一个多模式的文本编辑器
我们这里主要介绍vim最常用的三种模式命令模式插入模式底行模式
1.命令模式Normal mode
在命令模式下我们可以控制屏幕光标的移动字符字或行的删除复制粘贴剪贴等操作
2.插入模式Insert mode
只有在插入模式下才能进行文字的输入该模式是我们使用最频繁的编辑模式
3.底行模式Command mode
在底行模式下我们可以将文件保存或退出也可以进行查找字符串等操作。在底行模式下我们还可以直接输入vim help-modes查看当前vim的所有模式
vim下各模式的切换
指令vim 文件名
进入vim后默认是命令模式普通模式要输入文字需切换到插入模式 命令模式 切换至 插入模式
1输入 i :当前光标处进入插入模式
2输入 a :在当前光标的后一位置进入插入模式
3输入 o :在当前光标处起一行进入插入模式
命令模式 切换至 底行模式
1插入模式或是底行模式切换至命令模式都是直接按一下Esc键即可 vim命令模式下各指令汇总
【移动光标】
1按 k : 光标上移
2按 j : 光标下移
3按 h : 光标左移
4按 l 光标右移
5按 gg : 定位到光标到最开始行
6按shift g(G): 定位光标到结尾行
7按 n shift g(nG): 定位光标到任意行
8按shift $定位光标到当前行结尾
9按shift ^ :定位光标到当前行开始
10按w , e, b光标按照单词进行行内跨行移动
w光标从左往右从上到下的跳到下一个字的开头
e光标从左往右从上到下的跳到下一个字的结尾
b光标从右到左从上到下的跳到下一个字的开头
【删除复制剪切】
11按(n)yy复制光标所在行(n行)
12) 按(n)dd剪切删除
13) 按(n)p: 粘贴重复行到光标所在行下一行
【撤销】
14) 按u撤销
15按ctrl r撤销之前的撤销
【大小写转换】
16按shift ~大小写转换
按n shift ~大小写转换从光标所在位置一直往后n个字符进行大小写转换
【替换】
17按(n)r对光标之后的所有字符进行批量化替换
18按shift R替换模式对内容进行整体的替换 - 第四种模式
19按n)x对光标字符之后的字符进行删除
【更改】
21按cw将光标所在的位置开始到字尾的字符删除并进入插入模式
22按cnw将光标所在位置开往后的n个字删除并进入插入模式
【翻页】
23按Ctrlb上翻一页
24按Ctrlf下翻一页
25按Ctrlu: 上翻半页
26按Ctrld: 下翻半页
vim底行模式个指令汇总
先使用shhit
【保存退出】
1w 保存文件
2q 退出vim如果无法离开vim可在q后面跟一个表示强制退出
3wq 保存退出
【行号设置】
4set nu显示行号
5set nonu取消行号
【分屏指令】
6vs 文件名实现多文件的编辑
7Ctrl w w光标在多屏幕下进行切换
【执行指令】
8) !指令在不退出vim的情况下可以在指令前面加上就可以执行Linux的指令例如查看目录编译当前代码等
vim的简单配置
【配置文件的位置】
1在目录/etc/下面有个名为vimrc的文件这是系统中公共的配置文件对所有用户都有效
2在每个用户的主目录/home/xxx下都可以自己建立私有的配置文件命名为“vimrc”这是该用户的私有配置文件仅对该用户有效
例如普通普通用户在自己的主目录下建立了“.vimrc”文件后在文件当中输入set nu指令并保存
下一次打开vim的时候就会自动显示行号
Linux编译器 - gcc/g
gcc/g的作用
gcc和g分别是GUN的C和C的编译器
gcc和g在执行的时候一般有以下四个步骤
语法gcc/g 选项 文件
常用选项
1-E 只进行预处理这个不生成文件你需要把他重定向到一个输出文件里面否则将把预处理后的结果打印到屏幕上
2-S 编译到汇编语言不进行汇编和链接即只进行预处理和编译
3-c 编译到目标代码
4-o 将处理结果输出到指定文件该选项后紧跟输出文件名
5-static 此选项对生成的文件采用静态链接
6生成调试信息若不携带该选项则默认生成release版本
7-shared 此选项将尽量使用动态库生成文件较小
8-w不生成任何警告信息
9Wall 生成所有警告信息
10-O0/-O1/-O2/-O3 编译器优化选项的四个级别-O0表示没有优化-O1为缺省值-O3优化级别最高 预处理 (进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E test.c –o test.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。 编译生成机器可识别代码
在这个阶段中gcc/g首先检查代码的规范性是否有语法错误等以确定代码的实际要做的工作在检查无误之后将代码翻译成汇编语言
用户可以使用-S选项来进行查看该选项只进行编译而不进行汇编生成汇编代码
实例: gcc –S test.i –o test.s 汇编生成机器可识别代码
汇编阶段是把编译阶段生成的“xxx.s”文件转成目标文件
使用-c选项就可以得到汇编代码转换为“xxx.o”的二进制目标代码
实例: gcc –c test.s –o test.o 连接生成可执行文件或库文件
在成功完成以上步骤之后就进入了链接阶段
链接的主要任务就是将生成的各个“xxx.o”文件进行链接生成可执行文件
gcc/g不带-E, -S, -c选项时就默认生成预处理编译汇编链接全过程的后的文件
若不使用-o选项指定生成文件的文件名则默认生成的可执行文件名为a.out
实例gcc test1.c -o test 可以看到test直接就生成了可执行文件链接后生成的也是二进制文件
在这里涉及到一个重要的概念:函数库
我们的C程序中并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而 没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函 数“printf”了,而这也就是链接的作用
函数库一般分为静态库和动态库两种
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
gcc默认生成的二进制程序是动态链接的这点可以通过file 命令验证。
动态库
优点省空间磁盘的空间内存的空间bin体积小加载速度块
缺点依赖动态库程序可移植性较差
静态库
优点不依赖第三方库程序的可移植性较高
缺点浪费空间
gcc和g默认生成的二进制程序是动态链接的我们可以使用file指令进行查看 其次我们还可以使用ldd指令查看动态链接的可执行文件所依赖的库 其中/lib/x86_64-linux-gnu/libc.so.6就是当前云服务器当中的C标准库
如果我们需要使用静态链接我们可以加上-static选项
这时生成的可执行文件就是静态链接了 我们可以查看相同的源代码使用不同的链接方式所生成的可执行文件大小 可以看到动态链接确实比较节省空间静态链接比较浪费空间
在Linux下静态库(.so)动态库(.a)
在windows下静态库(.lib)动态库(.dll)
Linux调试器-gdb
1. 背景
程序的发布方式有两种debug模式和release模式
Linux gcc/g出来的二进制程序默认是release模式
要使用gdb调试必须在源代码生成二进制程序的时候, 加上-g选项 对同一份源代码分别生成其release版本和debug版本的可执行程序并通过ll指令可以看到debug版本发布的可执行的大小比release版本发布的可执行文件大小要大一点其原因就是在debug版本中包含了更多的调试信息
gdb命令汇总
【进入gdb】
指令gdb 文件名
【退出gdb】
退出 ctrl d 或 quit 调试命令
【调试】
r或run运行程序。
n 或 next单条执行。
s或step进入函数调用
until 行号跳转至指定行
finish执行完当前正在调用的函数后停下来不能是主函数
continue或c运行到下一个断点处
set var 变量x修改变量的值为x
【显示】
listl 行号显示binFile源代码接着上次的位置往下列每次列10行。
listl 函数名列出某个函数的源代码。
print/p 变量打印变量的值
print/p 变量打印变量的地址
print/p 表达式打印表达式的值通过表达式可以修改变量的值
display 变量将变量的地址加入常显示
undisplay 编号取消指定编号变量的常显示
bt查看各级函数调用及参数
info/i locals查看当前栈帧当中的局部变量的值
【断点】
break(b) 行号在某一行设置断点
break 函数名在某个函数开头设置断点
info break 查看断点信息。
delete breakpoints删除所有断点
delete breakpoints n删除序号为n的断点
disable breakpoints禁用断点
enable breakpoints启用断点
Linux项目自动化构建工具-make/Makefile
make/Makefile的重要性
会不会写Makefile从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中Makefile定义了一系列的 规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂 的功能操作Makefile带来的好处就是——“自动化编译”一旦写好只需要一个make命令整个工程完全自动编 译极大的提高了软件开发的效率。make是一个命令工具是一个解释Makefile中指令的命令工具一般来说大多数的IDE都有这个命 令比如Delphi的makeVisual C的nmakeLinux下GNU的make。可见Makefile都成为了一 种在工程方面的编译方法。make是一条命令Makefile是一个文件两个搭配使用完成项目自动化构建。
依赖关系和依赖方法
在使用make/Makefile之前我们首先应该理解各个文件之间的依赖关系以及它们之间的依赖方法
依赖关系文件A的变更会影响到文件B那么就称文件B依赖于文件A
例如test.o是由test.c文件通过预处理编译以及汇编之后生成的二进制文件即test.c的改变会影响到test.o所以我们可以得到test.o文件依赖于test.c文件
依赖方法如果文件B依赖于文件A那么通过文件A得到文件B的方法就是文件B依赖于文件A的依赖方法
例如test.o依赖于test.c而test.c通过 gcc -c test.c -o test.o 指令就可以得到test.o那么test.o依赖于test.c的依赖方法就是 gcc -c test.c -o test.o
多文件编译
当你的工程当中有多个源文件的时候应该如何进行编译生成可执行文件呢 我们可以直接使用gcc指令对多个源文件进行编译进而生成可执行程序 进行多文件编译的时候一般不使用直接生成可执行文件而是先用每个源文件各自生成自己的二进制文件然后再将这些二进制文件通过链接生成可执行程序 为什么让这样做
若是直接使用源文件生成可执行程序那么其中一个源文件进行了修改再生成可执行程序的时候就需要将所有的源文件进行编译链接重新生成一份新的可执行程序
我们若是先用每个源文件各自生成自己的二进制文件那么其中一个源文件进行修改就只需要重新编译生成该源文件的二进制文件然后再将这些二进制文件通过链接生成可执行程序即可
注意编译链接的时候不需要加上头文 件因为编译器通过源文件的内容可以知道所需头文件的名字而通过头文件的包含方式“尖括号”包含和“双引号”包含编译器可以知道应该从何处取寻找所需头文件
随着源文件个数的增加我们每次重新生成可执行程序时所需输入的gcc指令的长度与个数也会随之增加。这时我们将需要使用make和Makefile了有了它们两的加入这将大大的减少我们的工作量
make和Makefile的使用方法
步骤一在源文件所在的目录下创建一个名为Makefile/makefile的文件 步骤二编写Makefile
Makefile的编写格式是先写出文件的依赖关系然后下一行写出这些文件的依赖方法
根据自己需求可以写一个也可以写多个 编写完Makefile之后保存退出然后再命令行当中执行make指令便可以生成可执行程序以及该过程产生的中间产物 Makefile文件的简写方法 1.$: 表示依赖关系的目标文件(冒号的左侧)
2.$^: 表示依赖关系中的依赖文件列表(冒号右侧全部)
3.$: 表示依赖关系中依赖列表的第一个依赖文件(冒号左侧第一个)
使用以上符号简化上述操作 说明gcc/g携带-c选项时若不指定输出文件的文件名则默认输出文件名为 xxx.o所以这里也可以不用指定文件名
make原理
1.make会在当前目录下寻找名字为“Makefile”或者“makefile”的文件
2.如果找到它会找文件当中的第一个目标文件在上面的例子中它会找到mytest这个文件并把这个文件当作最终的目标文件
3.如果mytest文件不存在或是mytest所依赖的后面的test.o和main.o文件的文件修改时间比mytest文件新如果比mytest老make的操作就不会执行那么它就会执行后面的依赖方法来生成mytest文件
4.如果mytest所依赖的test.o文件不存在那么make会在Makefile文件中寻找目标为test.o文件的依赖关系如果找到则在根据其依赖方法生成test.o文件(类似于堆栈的过程)
5.如果你的test.c文件和main.c文件是存在的make会根据依赖方法生成test.o文件和main.o文件然后使用这两个文件形成最后的可执行文件mytest
6.make会一层一层的取找文件的依赖关系直到编译出第一个目标文件
7.在寻找的过程中如果出现错误例如最后被依赖的文件找不到那么make就会直接退出并报错
项目清理
在我们每次生成可执行程序前都将上一次生成的可执行程序时生成的一系列文件进行清理除了我们手动清理之外我们还可以借助 make 帮助我们进行清理这时我们可以将项目清理的指令加入到Makefile文件当中 像clean这种没有被第一个目标文件直接或间接关联那么你直接使用make它不会自动执行所以我们可以显示使用make执行 注一般将clean这种目标文件设置为伪目标使用.PHONY修饰伪目标的特性是总是被执行 Linux第一个小程序 - 进度条
行缓冲区的概念
首先我们来感受一下行缓冲区的存在在LInux当中以下代码的运行结果如何 对于以上代码它的输出为hello world然后休眠三秒之后结束运行
我将第6行末尾的\n删除之后其实代码的运行结果就已经改变了现在的运行结果先休眠3秒然后才会将hello world输出出来。休眠的3秒钟其实hello world被放到了行缓冲区中这种现象其实就证明了行缓冲区的存在
显示器对应的是行刷新即当缓冲区当中遇到‘\n’或是缓冲区被写满才会被打印出来而在第二份代码当中并没有‘\n’所以字符串hello world先被写到缓冲区当中去了然后休眠3秒后直到程序结束时才将 hello world 打印到显示器当中
\r 和 \n
\r: 回车使光标回到本行行首
\n: 换行使光标下移一格
在实际当中其实我们通常使用的Enter键就等价于 \n \r
接下来我们来做一个有趣的实验
既然\r是使光标回到本行行首那么如果我们向显示器上写了一个数之后再让光标回到本行行首然后再写一个数不就相当于将前面一个数据给覆盖了吗
注意我们可以使用\n刷新缓冲区也可以使用fflush函数刷新缓冲区即将缓冲区当中的数据刷新到当前显示器当中
对此我们可以编写一个倒计时的程序 在以上代码的最后我们使用printf(\n);进行刷新操作不然最后的数据0会被命令行给刷新掉 进度条代码及效果展示 效果展示