学做家常菜的网站 知乎,html5网站特效,logo 在线生成,东营市东营网站设计#x1f680; 作者简介#xff1a;一名在后端领域学习#xff0c;并渴望能够学有所成的追梦人。 #x1f681; 个人主页#xff1a;不 良 #x1f525; 系列专栏#xff1a;#x1f6f9;Linux #x1f6f8;C #x1f4d5; 学习格言#xff1a;博观而约取#xff… 作者简介一名在后端领域学习并渴望能够学有所成的追梦人。 个人主页不 良 系列专栏Linux C 学习格言博观而约取厚积而薄发 欢迎进来的小伙伴如果小伙伴们在学习的过程中发现有需要纠正的地方烦请指正希望能够与诸君一同成长 文章目录 Linux软件包管理器——yumyum简介yum的使用yum源 Linux编辑器——vimvim基本概念vim 命令模式命令集vim末行底行模式命令集vim的配置 Linux编译器——gcc/ggcc/g的作用gcc/g过程分析预处理编译汇编链接 动静态库 Linux调试器——gdbgdb调试命令汇总实例调试 Linux自动化构建工具——make/Makefile依赖关系和依赖方法make/Makefile的使用 sudo提升权限Linux小程序——进度条缓冲区的概念\r和\n倒计时小程序进度条小程序 git命令行的使用在Linux上使用git Linux软件包管理器——yum
yum简介
我们平时在手机上安装软件都需要先去应用商店搜索找到想要的软件下载并且安装有些手机也支持在应用商店里卸载软件yum就相当于手机上的应用商店在联网的情况下可以通过yum的相关指令搜索软件包下载安装并且可以卸载。
yum的使用
搜索指令——yum list | grep 软件包名称
当我们想使用yum查看一共有哪些软件包的时候可以通过yum list指令但是往往软件包非常多所以我们可以通过yum list | grep 软件包名称指令查找我们想要的软件包。如下图我们想安装sl软件包可以通过yum list | grep sl指令搜索。 说明 搜索列表中出现的以这种形式展现软件包名称.系统安装包 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构 提供者。如上面搜索的sl.x86_64中sl是软件包名称。 x86_64后缀表示64位系统的安装包i686后缀表示32位系统安装包选择包时要和系统匹配。 “el7” 表示操作系统发行版的版本“el7” 表示的是 centos7/redhat7。 最后一列base 表示的是 “软件源” 的名称, 也就是软件包的提供者。 安装指令——yum -y install 软件包名称/yum install -y 软件包名称
当我们通过搜索指令找到自己要安装的软件包之后可以在root用户下通过指令yum -y install 软件包名称进行安装普通用户需要使用sudo yum -y install 软件包名称如下图我们要安装sl软件包可以使用yum -y install sl.x86_64指令。 当出现Complete时安装完成运行sl指令查看是否能够运行运行情况如下图。 卸载指令——yum -y remove 软件包名称/yum remove -y 软件包名称
当我们不再使用该软件时可以在root用户下通过指令yum -y remove 软件包名称进行卸载普通用户需要使用sudo yum -y remove 软件包名称如下图我们使用yum -y remove sl.x86_64卸载sl。 注意事项 1.一个服务器同一时刻只允许一个yum进行安装不能在同一时刻同时安装多个软件。 2.安装软件时由于需要向系统目录中写入内容普通用户需要sudo指令提升权限或者在root用户下才能进行安装。 3.上面指令中的-y表示直接安装不再进行交互询问可以不加-y此时进行交互询问键入y之后进行安装。 yum三板斧
1、搜索指令——yum list | grep 软件包名称
2、安装指令——yum -y install 软件包名称/yum install -y 软件包名称
3、卸载指令——yum -y remove 软件包名称/yum remove -y 软件包名称
yum源
当我们使用yum指令进行搜索安装的时候它是怎么知道要去哪里下载的呢这是因为yum有自己的配置文件内置下载链接的地址——yum源。
下图中我们可以看到yum源仓库及仓库中大量的下载链接repo就是仓库的简写。 我们可以尝试更改配置yum源步骤 1.先备份老的yum源CentOS-Base.repo保证尝试配置失败时可以恢复; 2.通过指令wget yum源链接 获取新的yum源配置文件; 3.因为系统默认回到CentoS-Base.repo这个仓库中去寻找地址下载软件所以通过mv指令将新的yum源重命名成为CentOS-Base.repo 4.运行yum clean all yum makecache指令使其生效。 如果想安装的软件找不到有可能就是在扩展yum源epel.repo中此时在root用户下或者使用sudo指令提升权限运行yum install -y epel-release指令系统会根据你的base yum源帮我们找到和他匹配的扩展yum源此时再执行安装程序就行。 扩展实现本地机器和云服务器之间的文件互传 指令rz -E可选择本地机器上的文件上传到云服务器。 指令sz 文件名可以选择云服务器上的文件下载到本地机器的指定文件夹中。 Linux编辑器——vim
vim基本概念
vim是一款多模式的编辑器大多数情况下用来编辑代码如果没有安装vim可以使用sudo yum install -y vim或者在root用户下运行yum install -y vim安装vim。我们最常用的模式有以下三种
1.正常/普通/命令模式(Normal mode)
默认打开的时候vim处于命令模式此时我们可以通过相关的指令来控制屏幕光标的移动字符、字或行的删除移动复制等操作可以通过键盘上i进入插入模式。
2.插入模式(Insert mode)
只有插入模式下我们才可以进行代码的编辑按ESC键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
3.末行/底行模式(last line mode)
文件保存或退出列出行号等操作。 在命令模式下shift;即可进入该模式在底行模式下输入q退出vim编辑器。
模式之间的切换命令模式切换插入模式在键盘上直接按i退出插入模式按ESC键命令模式切换底行模式按下shift和;退出底行模式按ESC底行模式和插入模式之间不能切换。注意不同模式之间的切换需要在输入法为英文模式下进行切换。 vim 命令模式命令集
刚进入vim时处于命令模式此时我们可以通过以下命令进行相应的操作。
命令模式切换为插入模式
i进入插入模式后按“i”进入插入模式后是从光标当前位置开始输入文件
s删除一位后进入插入模式
a进入插入模式后是从目前光标所在位置的下一个位置开始输入文字
o进入插入模式后是插入新的一行从行首开始输入文字
移动光标
vim可以直接用键盘上的上下左右键移动但正规的vim是用小写英文字母h、j、k、l分别控制光标左、下、上、右移一格
按gg将光标定位到文档的最开始
按「G」将光标定位到文档最结尾
按「$」移动到光标所在行的行尾 按「^」移动到光标所在行的行首 按「w」光标跳到下个字的开头 按「e」光标跳到下个字的字尾 按「b」光标回到上个字的开头 按「#l」光标移到该行的第#个位置如5l56l
按shiftg进入文本末端 按「ctrl」「b」屏幕往“后”移动一页 按「ctrl」「f」屏幕往“前”移动一页 按「ctrl」「u」屏幕往“后”移动半页 按「ctrl」「d」屏幕往“前”移动半页
删除文字
「x」每按一次删除光标所在位置的一个字符 「#x」例如「6x」表示删除光标所在位置的“后面包含自己在内”6个字符 「X」大写的X每按一次删除光标所在位置的“前面”一个字符 「#X」例如「20X」表示删除光标所在位置的“前面”20个字符 「dd」删除光标所在行 「#dd」从光标所在行开始删除#行
复制
「yw」将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」复制#个字到缓冲区 「yy」复制光标所在行到缓冲区。 「#yy」例如「6yy」表示拷贝从光标所在的该行往下数6行文字。 「p」将缓冲区内的字符贴到光标所在位置。注意所有与y有关的复制命令都必须与p配合才能完成复制与粘贴功能同时使用[dd]删除的指令也可以使用p指令粘贴。
替换
「r」替换光标所在处的字符。
「shift」 「r」进入替换模式替换光标所在位置替换之后不想要可以删除删除之后恢复成之前的字符。完成之后「ESC」进入命令模式。
「shift」 「~」在光标处快速进行大小写切换。
撤销上一次操作
「u」如果您误执行一个命令可以马上按下「u」回到上一个操作。按多次“u”可以执行多次回复。 「ctrl r」: 撤销的恢复。
更改
「cw」更改光标所在处的字到字尾处 「c#w」例如「c3w」表示更改3个字
跳至指定的行
「ctrl」「g」列出光标所在行的行号。 「#G」例如「15G」表示移动光标至文章的第15行行首。
vim末行底行模式命令集
在使用末行模式之前请记住先按「ESC」键确定您已经处于正常/命令模式再按shift ;即可进入底行模式。
列出行号
「set nu」: 输入「set nu」后会在文件中的每一行前面列出行号。
取消行号
「set nonu」: 输入「set nonu」后会将文件中的每一行前面的行号取消。
跳到文件中的某一行
「#」:「#」号表示一个数字在冒号后输入一个数字再按回车键就会跳到该行了如输入数字15再回车就会跳到文章的第15行。
查找字符
「/关键字」: 先按「/」键再输入您想寻找的字符如果第一次找的关键字不是您想要的可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」先按「?」键再输入您想寻找的字符如果第一次找的关键字不是您想要的可以一直按「n」会往前寻找到您要的关键字为止。 两者的区别是[/关键字]是从文件顶部开始向下找而「?关键字」是从文件底部开始向上找。 「w」: 在冒号输入字母「w」就可以将文件保存起来
分屏指令
「vs 文件名」实现多文件的编辑在vim分屏模式下光标在哪里我们就在编写哪一个文件。
「ctrlww」连续按两次w切换光标到不同的界面。退出时光标在哪一个界面退出的就是哪一个文件。
执行指令
「!指令」在不退出vim的情况下可以在指令前面加上「!」就可以执行Linux的指令例如查看目录、编译当前代码等。
离开vim
「q」按「q」就是退出如果无法离开vim可以在「q」后跟一个「!」即输入「q!」强制离开vim。 「wq」一般建议离开时搭配「w」一起使用这样在退出的时候还可以保存文件。
注意事项
1.如果你不知道自己在什么模式下可以无脑ESC确保自己在命令模式下命令模式下可以切换到其他模式。
2.退出的时候一般都是先保存再退出底行模式下输入wq指令。
3.在vim中操作不要用鼠标和鼠标的滑轮。
vim的配置
a.自己配置不推荐
vim在启动的时候会自动在当前用户的目录下寻找配置文件如果没有就是默认。
在目录/etc/下面有个名为vimrc的文件这是系统中公共的配置文件对所有用户都有效。 在每个用户的主目录/home/x下都可以自己建立私有的配置文件命名为.vimrc这是该用户私有的配置文件仅对该用户有效.一个用户一个vim配置我们所做的配置不会影响其他人。
先创建一个文件.vimrc创建的配置文件都在这个文件中配置即刻生效如我们自己创建的配置文件中设置行号 不想使用的时候也可以通过双引号注释掉 b.自动配置推荐
我们这里推荐的方法就是直接执行以下指令想在哪个用户下让vim配置生效就在哪个用户下执行该指令不推荐直接在root下执行
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh bash ./install.sh在普通用户下安装要按照提示输入root密码 在root用户下安装不需要输入密码直接安装完成安装成功之后需要按照命令提示操作才能成功使用配置文件需要退出用户登录或者输入source ~/.bashrc 命令。 我们选择输入source ~/.bashrc命令输入之后配置就生效了。
生效之后我们再进入vim编辑器我们会发现自动补全、行号显示以及自动缩进等功能都有了。 当我们不想使用的时候也可以选择卸载在安装了VimForCpp的用户下执行bash ~/.VimForCpp/uninstall.sh就可以完成卸载。
Linux编译器——gcc/g
通过前面的学习我们知道编译过程由以下四个步骤
1、预处理头文件展开、条件编译、宏替换、去注释等C语言经过预处理之后还是C语言
2、编译词性、语义分析、符号汇总等编译的过程是将C语言转换成汇编语言
3、汇编生成符号表等汇编的过程是将汇编语言转变成为可重定位的目标二进制文件该文件不可以被执行最后形成.obj文件windows下
4、链接符号表汇总等将我们自己形成的.obj文件和库文件进行某种合并形成可执行程序。
gcc/g的作用
gcc专门用来编译C语言的g专门用来编译C的当我们在Linux下创建一个.c文件之后可以通过gcc编译生成a.out可执行文件 可以通过gcc -o设定要生成的目标文件的名称-o选项后面跟的一定是要生成文件的名称。上面的test.c文件我们想生成test可执行文件可以写成gcc -o test test.c或者gcc test.c -o test。比较推荐的是gcc test.c -o test gcc/g过程分析
程序的翻译主要分为编译和链接编译又可以分为预处理、编译、汇编
常用选项 -E从当前文件.c文件开始开始进行程序的翻译预处理做完就停止预处理之后的文件习惯称为.i文件。 -S从当前文件开始可以从.c文件开始翻译也可以从.i文件开始翻译进行程序的翻译当编译完成就停下来编译后的文件通常以.s作为后缀通常.s作为汇编文件的后缀 -c从当前文件开始进行程序的翻译做完汇编就停止生成的文件我们一般加后缀.o.o对等于windows中的.obj。
预处理
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。预处理指令是以#号开头的代码行。选项-E,该选项的作用是让gcc在预处理结束后停止编译过程。选项-o是指目标文件,.i文件为已经预处理过的C原始程序举例cc
-E从当前文件.c文件开始开始进行程序的翻译预处理做完就停止预处理之后的文件习惯称为.i文件。 如上图所示当我们直接使用gcc -E 目标文件这里我们测试用例使用的是test.c文件会将执行结果直接打印在屏幕上所以我们可以使用-o选项指定文件名称假设我们要生成的文件名称是test.i文件 然后我们再对比一下 test.i就是预处理之后形成的临时文件我们可以在test.i文件中可以看到头文件展开和宏替换.i文件还是C语言。
编译
在这个阶段中gcc首先要检查代码的规范性、是否有语法错误等以确定代码的实际要做的工作在检查无误后gcc把代码翻译成汇编语言。用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。举例gcc -S test.i -o test.s
-S从当前文件开始可以从.c文件开始翻译也可以从.i文件开始翻译进行程序的翻译当编译完成就停下来编译后的文件通常以.s作为后缀通常.s作为汇编文件的后缀。 打开之后就是汇编语言 汇编
汇编阶段是把编译阶段生成的.s文件转成目标文件.o。使用选项-c可以看到汇编代码转化为.o的二进制目标代码举例:gcc –c test.s –o test.o
-c从当前文件开始进行程序的翻译做完汇编就停止生成的文件我们一般加后缀.o.o对等于windows中的.obj。 打开文件之后就是 不能执行该文件即便添加权限也不能执行 说明.o和.obj文化都是不可以执行的。
链接 在成功编译之后,就进入了链接阶段 举例gcc test.o -o test 链接后生成的也是二进制文件。
动静态库
我们为什么能够在Linux下进行C、C代码的编写呢
Linux系统默认已经携带了语言级别的头文件和文件对应的库。
在Linux中库存放在哪里呢存放在 /usr/include中 命令ldd 可执行程序文件名可以查找链接库的的位置 去掉前缀lib后缀.a或者.so中间剩下的就是库的名字上面面库的名称就是c-2.17。
库分两种库本质也是一种文件
1、静态库一般是以lib开头以.a结尾如libxxx.a
2、动态库一般是以lib开头以.so结尾如libxxx.so
上面两点是Linux下特有的动静态库划分Windows下的静态库后缀为.lib动态库后缀.dll原理相似。
我们安装VS2022、VS2019的时候最重要的一个工作是什么帮我们下载并安装语言的头文件和库文件。
我们用的指令有相当一部分都是用C语言写的。如何看待指令呢指令就是程序、工具、指令在Linux下一切皆文件。
动静态库
静态库是指编译链接时把库文件的代码全部加入到可执行文件当中因此生成的文件比较大但在运行时也就不再需要库文件了静态库一般以.a为后缀。动态库与之相反在编译链接时并没有把库文件的代码加入到可执行文件当中而是在程序运行时由链接文件加载库这样可以节省系统的开销动态库一般以.so为后缀。如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后gcc 就可以生成可执行文件。
动静态链接
静态链接将你所需要的代码拷贝到你的程序中使用静态链接即使库不存在了也不影响程序的执行。动态链接将你所需要的方法的地址拷贝到你的程序中。动态库所谓的链接的过程就是把我们所要用的方法对应的地址调用函数的地址拷贝进我们的程序里这个工作就叫做链接。
动态库共享库凡是共享的只需要一份就行。当共享库被删除所有依赖共享库的都将无法使用。
总结
1.所有库分为静态库专门让编译器对用户的程序进行静态链接的和动态库专门让编译器对用户的程序进行动态链接的。
2.静态库和静态链接链接的时候如果是静态链接找到静态库拷贝静态库中的我所需要的代码到我自己的可执行程序中。
3.动态库和动态链接链接的时候如果是动态链接找到动态库拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位置。
4.静态链接成功我们的程序不依赖任何库自己就可以独立运行。
5.动态链接成功我们的程序还是依赖动态库一旦动态库缺失我们的程序便无法运行。
6.静态库的缺点因为自身拷贝的问题比较浪费空间。
7.动态库的优点因为可以做到被大家共享方法所以真正的实现永远都是在库中程序内部只有地址比较节省空间。
8.静态库vs动态库Linux默认使用的是动态链接和动态库。
怎么判断是动态库还是静态库
file指令后面跟上文件名根据说明判断是否是动态链接使用的是共享库。 如果进行静态链接呢在gcc进行编译时在后面加上-static选项一般的云服务器默认都是只有动态库如果在进行C语言和C静态链接时可能会出现如下报错 此时可以通过命令yum install -y glibc-static安装C静态库也可以通过yum install glibc-static libstdc-static -y或者yum -y install glibc-static libstdc-static同时安装C和C的静态库 此时再查看文件类型时就会发现显示静态链接 我们可以观察一下两种不同链接方式生成的文件大小 充分证明了动态链接比静态链接更加节省空间。
Linux调试器——gdb
程序的发布方式有两种debug模式和release模式Linux下gcc/g编译出来的二进制程序默认是release模式但是如果要使用gdb调试必须是在debug模式下所以必须在源代码生成二进制程序的时候在后面加上-g选项保证是debug模式。
gdb调试命令汇总
进入gdb 指令 gdb 文件名
调试 1「run/r」运行代码启动调试。 2「next/n」逐过程调试。 3「step/s」逐语句调试。 4「until 行号」跳转至指定行。 5「finish」执行完当前正在调用的函数后停下来不能是主函数。 6「continue/c」运行到下一个断点处。 7「set var 变量x」修改变量的值为x。
显示 1「list/l n」显示从第n行开始的源代码每次显示10行若n未给出则默认从上次的位置往下显示。 2「list/l 函数名」显示该函数的源代码。 3「print/p 变量」打印变量的值。 4「print/p 变量」打印变量的地址。 5「print/p 表达式」打印表达式的值通过表达式可以修改变量的值。 6「display 变量」将变量加入常显示每次停下来都显示它的值。 7「display 变量」将变量的地址加入常显示。 8「undisplay 编号」取消指定编号变量的常显示。 9「bt」查看各级函数调用及参数。 10「info/i locals」查看当前栈帧当中局部变量的值。
断点 1「break/b n」在第n行设置断点。 2「break/b 函数名」在某函数体内第一行设置断点。 3「info breakpoint/b」查看已打断点信息。 4「delete/d 编号」删除指定编号的断点。 5「disable 编号」禁用指定编号的断点。 6「enable 编号」启用指定编号的断点。
退出gdb 1「quit/q」退出gdb。
实例调试
我们在Linux下通过下面的代码来更加详细的认识这些操作 当我们使用gcc test.c -o test编译运行的时候会出现如下报错 这是因为在for循环里初始化是C99之后才能支持的所以我们要在指令的后面加上 -stdc99或者-stdgnu99才可以 当我们想使用gdb调试的时候怎么调试呢
当我们直接使用gdb加上可执行程序名时会出现如下报错信息 这是因为Linux下默认生成的是release版本的而release不能用来调试要在debug版本下进行调试我们可以使用quit或q指令离开上述调试界面在编译程序的时候添加-g选项可以使其为debug模式-g让gcc、g以debug方式调试 为什么debug能调试release不能调试因为release是客户使用的不加调试信息体积相对较小。 读取可执行程序的二进制构成用readelf -S指令Linux形成的可执行程序遵守的二进制规则是elf格式。 搜索调试信息 gdb调试test(gdb)后可以直接输入指令
l 0或者l 1 (这里的l也可以替换成L)可以从第0行或者第1行开始查看代码信息随后直接按enter就可以往下查看。l这个命令是list的简写 输入指令r进行调试此时还没有打断点直接执行完毕正常执行正常退出 指令b 行号设置断点b后面跟的是行号 查看断点指令info b其中Num表示的是断点编号 再次运行r指令在断点处停止方便进行单步调试 再次查看断点info b提示当前断点已经被命中一次 删除断点d 断点编号d后面跟断点编号删除之后输入info b查看发现当前无断点 输入r 会提示是否从开始处运行选择n即继续向下调试选择y就是从头开始 再次创建断点并且运行编号是2没有退出gdbnum编号依次递增 使能不删除断点让断点失去作用。在VS中右击断点可以看到关闭实心变空心输入disable breakpoint 断点编号或者disable 断点编号设置空断点输入enable 断点编号使断点恢复作用 打断点我们也可以使用b 函数名文件名函数名或者b 文件名:行数 在VS下
逐过程F10以函数为单位不进入函数跳过函数。
逐语句F11有函数进入函数。
gdb下类似于逐过程用指令nnext也可以逐语句sstep也可以指令进入函数。gdb会记住上一次的指令所以我们可以直接按回车执行上一次输入的指令 监视可以用p 变量指令 想要一直看到变量变化可以用display 变量指令常显示内置类型结构体等自定义类型stl等
取消常显示undisplay 前面显示的编号才能够取消如果加undisplay sum 不能取消 执行到把循环跑完可以直接用until 预期行数。下图中10显示的是预期要到的行数在函数内进行指定位置的跳转执行完区间代码 当函数嵌套调用时可以查看压栈的过程使用bt指令最下面的就是最先执行的 finish指令进入一个函数只执行完该函数就停下进入函数后 从一个断点到另一个断点使用ccontinue指令下图中是在第15行和第17行打断从一个断点运行至下一个断点 set var 指令 设置变量为某个值下图中为设置变量i等于20 调试器核心工作是为了定位问题。所有查看内容的指令并不影响实际调试指令。
Linux自动化构建工具——make/Makefile
一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作。makefile带来的好处就是——自动化编译只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率。make是一个命令工具是一个解释makefile中指令的命令工具一般来说大多数的IDE都有这个命令比如Delphi的makeVisual C的nmakeLinux下GNU的make。可见makefile都成为了一种在工程方面的编译方法。make是一条命令makefile是一个文件makefile通常在当前的源代码路径下两个搭配使用完成项目自动化构建。
依赖关系和依赖方法
依赖关系 文件A的变更会影响到文件B那么就称文件B依赖于文件A。
例如test.i文件是由test.c文件预处理之后得到的那么test.c文件的改变会影响test.i文件所以test.i文件依赖于test.c文件。
依赖方法 如果文件B依赖于文件A那么通过文件A得到文件B的方法就是文件B依赖于文件A的依赖方法。
例如test.i依赖于test.c而test.c需要通过gcc -E test.c -o test.i指令得到test.i那么test.i依赖于test.c的依赖方法就是gcc -E test.c -o test.o。
make/Makefile的使用
之前当我们需要编译文件的时候我们通常是直接输入gcc指令生成可执行程序 但是我们可以直接使用Makefile文件先创建一个Makefile文件在里面编辑如下test依赖于test.c依赖方法为gcc test.c -o test 第一行中我们要用test.c形成test通常我们把这组关系叫做依赖关系。
第二行我们叫做依赖方法。makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译的工具完成一件事情必须有正确的依赖关系和依赖方法。
make命令使其能够运行makefile文件中的内容 可以通过rm指令删除test可执行文件也可以通过在Makefile文件中进行语句的定义之后调用命令进行清理 执行make clean指令 下图中按照编译的顺序进行操作第一行中由test.o文件形成test文件但是因为没有test.o文件所以向下看……这里就好像是栈上面的依赖关系先入栈然后再慢慢出栈。
Makefile文件中显示的是下面这样但是在make执行时是先执行最下面的。 通常不用这个方法写。
Makefile中的简写方式
$表示依赖关系中的目标文件冒号左侧。$^表示依赖关系中的依赖文件列表冒号右侧的所有文件。$表示依赖关系中的第一个依赖文件冒号右侧第一个。 **依赖关系中目标文件对应的依赖文件列表可以是空。:前是目标文件:后面的是目标文件列表。 **
清理 为什么make 后面要加上clean而执行test时不需要呢因为Makefile默认执行第一组依赖关系和依赖方法。我们也可以在执行make的时候在后面加上test当我们把clean放到第一组的位置上默认执行的就是clean。
make就是给Makefile制作的一个命令。 上图意思是test文件已经是最新的了不需要进行编译了。这也说明了test文件不是总是被执行的。
关键字.PHONY总是被执行的一般用.PHONY修饰的符号称为伪目标特征就是总是被执行的。 一般将clean的目标文件设置为伪目标。
我们通过给第一组依赖关系加上.PHONY来验证 不建议给目标文件加关键字.PHONY。
上面执行时为什么make会知道这是最新的
通过对比源代码和可执行程序的时间 Modify时间可以通过touch源文件的方式在不更改源代码的情况下改变Modify时间 sudo提升权限
当我们使用sudo命令提升指令权限时输入密码后提示当前的用户不在系统的信任列表里 要是想使用sudo命令首先要将用户添加到信任名单信任名单在etc下的sudoers中权限限制需要root用户才能添加 在root用户下打开root用户不受权限约束 上面的内容不管我们直接找到上图所示的地方然后yy复制p粘贴将名字修改为想要提升权限的用户名 但是在最下面还是会有下列提示信息此时我们在w后面加上就可以保存。此时就将用户添加信任列表里 此时再执行sudo指令就可以提升权限了当用户登录的时候不能删除该用户。
Linux小程序——进度条
缓冲区的概念
我们先在Linux上执行下面的代码 执行结果 当我们将代码修改为下面这样 执行结果为 两份代码的区别就是在printf打印时\n的区别打印结果不相同证明了缓冲区的概念。
我们需要知道显示器对应的是行刷新只有在缓冲区遇到\n或是缓冲区被写满或者程序结束时缓冲区内容才会被打印出来而在第二份代码当中并没有\n所以字符串Hello demo先被写到缓冲区休眠3秒之后直到程序运行结束才将Hello demo打印到显示器当中。
那如果不使用\n进行换行怎么刷新缓冲区可以使用fflush函数头文件是stdio.h该函数可以刷新缓冲区。 运行结果 \r和\n
\r 回车使光标回到本行行首。 \n 换行使光标下移一格。
观察下面代码 运行结果 当我们将上面的代码修改为下面的代码时就会被覆盖原因就是\r把光标放在最开始把打印出的内容给覆盖了 执行结果 \r不会刷新缓冲区。
倒计时小程序
我们可以利用\r的特性写一个倒计时小程序 利用\r的特点让每次输出的内容都从行首开始打印运行结果 进度条小程序
进度条小程序代码 当想在进度条后面提示%多少时候可以加如下代码%符号在输出的时候可以用%%符号来表示。
运行结果 C语言也可以输出彩色 也可以将代码修改一下给进度条加上颜色 打印结果 git命令行的使用
git是开源、去中心化、分布式的git能够进行版本管理在更新的同时保存之前的版本就是版本管理版本号可以根据标签分组。
git --version命令用来查看当前git版本。 如果没有安装可以使用yum install -y git进行安装要注意需要在root用户下进行安装。
我们在Gitee官网建好仓库 创建成功之后在管理最下面开源空仓库不允许开源还可以添加开发人员。
在Linux上使用git
我们在一个新建的测试目录下进行测试 先复制链接然后git clone 链接把远端仓库的所有内容克隆过来因为现在是私有仓库需要输入用户名和密码开源仓库可以直接拷贝。 把远端仓库克隆下来之后cd进入仓库如果此时不小心把仓库删掉了再克隆就可以了删本地不影响远端 查看REMADE.md 什么是仓库就是.git目录.git就是仓库里面包含各种各样的文件object下有版本号 要注意不能修改.git名字。
将目标文件拷贝到当前git目录下 当前只是把文件拷贝到了本地的目录当中并没有把文件添加到仓库中。
.就是把当前目录下所有没被添加的文件添加到仓库中暂存区: 然后进行提交git commit -m后面的内容不要随便乱写应说明提交内容。
这个提交是把修改的内容提交到本地仓库就是本地.git。此时出现两个错误 这个报错信息提示我们要输入自己的邮箱号和名称 修改成功之后重新进行上述操作 本地仓库提交成功。
最后再提交到远程仓库这个提交就是把.git里面不一样的内容提交到远端仓库里面 如上图就是成功提交。
我们可以通过git log指令查看日志信息 此时在Gitee网页端也能看到成功提交 当我们想删除git中的proc.c文件时 当我们想看看本地和远端之间的同步状态时可以使用git status指令 此时在远端仓库中文件还没有删除要是想删除可以再次进行git三板斧
git三板斧
git add -- git commit -m 说明 -- git push。 Gitee网页中没有proc.c文件删除成功 push时可以设置免密码暂不建议免密码免密提交。
怎么删除本地仓库呢 当.git被删除后这些文件就是Linux普通文件。
远程仓库需要在网页删除。