我们在windows下下载软件,基本都是去网上搜索,然后下载对应安装包,再将安装包进行安装对应的应用程序,我们当然也可以在Linux这样进行安装,但是去网上找可能存在版本,软件适配等等问题,因此就产生了应用商店这种东西,而Yum就是Linux下的应用商店,也叫做软件包管理器。
我们现在简单学习一下Linux下yum的使用。
通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包
yum list | grep lrzsz
分别对字段解释
首先是软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
而"x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念
通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装
sudo yum install gcc
安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成
也是一条命令:sudo yum remove gcc
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows
vim三种常见的模式:分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
正常/普通/命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
插入模式:命令模式时按i即可进入,只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式
末行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式,输入w保存写入,q表示退出,wq!强制写入并退出。
进入vim,在系统提示符号输入vim及文件名称如vim test.c 后,就进入vim全屏幕编辑画面:
当你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字。
[正常模式]切换至[插入模式]: 输入a i o皆可,按“i”进入插入模式后是从光标当前位置开始输入文件;按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
[插入模式]切换至[正常模式]:按下键盘Esc即可退回正常模式
[正常模式]切换至[末行模式]:shift+;就是:后进入末行模式
退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:
: w (保存当前文件)
: wq (输入「wq」,存盘并退出vim)
: q! (输入q!,不存盘强制退出vim)
移动光标:
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后,而「#G」可以移动到指定行:例如,「15G」,表示移动光标至文章的第15行行首
按gg:移动到文章的最开始
按「ctrl」+「b」:屏幕往“后”移动一页按
「ctrl」+「f」:屏幕往“前”移动一页
删除文字:
「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「#dd」:从光标所在行开始删除#行,5dd删除光标后五行
复制字符:
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能
替换:
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
撤销上一次操作:
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
「ctrl + r」: 撤销的恢复
在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。
末行模式使用man:直接!man即可,或者!man 3 sleep,查询其头文件和用法。
跳到文件中的某一行:输入数字即可。
查找字符:「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。但是它是从文章结尾开始匹配
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~,打开自己目录下的.vimrc文件,执行 vim .vimrc,即可配置。
常用的一些配置:
设置语法高亮: syntax on
显示行号: set nu
设置缩进的空格数为4: set shiftwidth=4
????????编译的相关内容我们在之前的C语言的博客中曾写过,如今来回忆一下。C语言文件想要执行需要经过四个过程:1. 预处理(进行宏替换,头文件展开,条件编译)2. 编译(进行词法分析,语法分析,之后生成汇编) 3. 汇编(生成机器可识别代码,会生成二进制文件)4. 连接(将所有执行需要用到的.o文件链接在一起,生成可执行文件或库文件)。
格式 gcc [选项] 要编译的文件 [选项] [目标文件]。
实例: gcc –E hello.c –o hello.i? 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
实例: gcc –S hello.i –o hello.s?可以使用“-S”选项该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –c hello.s –o hello.o?可以使用“-c”选项使其执行完汇编阶段停止。
实例: gcc hello.o –o hello? 执行完链接阶段停下。
当然我们可以一步到位。gcc hello.c -o hello,让他直接执行生成可执行程序。
????????在链接阶段中,我们需要将C标准库链接到我们的可执行程序中,虽然我们包含了stdio.h的头文件,但里面只有printf函数的声明实际的函数实现并没有。原来系统将这些函数实现全部放到名为 libc.so.6 的库文件中去了,这是C语言的标准库,它其中都是已经经过编译汇编阶段后的二进制文件,可直接被调用,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,之后将这个库文件与我们程序链接到一起。
但是,链接方式有两种,动态与静态。
动态链接:我们最后生成的hello可执行程序中,涉及到库函数调用的地方变成一个地址,通过地址去调用这些库函数。
静态链接:会把我们把库文件的代码全部加入到可执行文件中,这样我们也可以正常调用库函数了。
而动态链接使用的库叫做动态库,linux下后缀名字为.iso,windows下后缀名为.dll。
静态链接使用的库叫做动态库,linux下后缀名字为.a,windows下后缀名为.lib。
Linux下默认采用的方式为动态链接,同时默认一定会链接到C标准库,我们可以通过file命令查看其使用哪种链接方式
同时如果我们想要采用静态链接方式,需要gcc编译的时候加上-static选项。
我们的服务器一般是没有安装C语言静态库的,我们需要自己安装,指令如下:
sudo yum install -y glibc-static
sudo yum install -y libstdc++-static
1.程序的发布方式有两种,debug模式和release模式,release模式针对用户和测试人员使用,优化激进,所占空间较小,而我们开发人员需要调试则需要在debug模式下
2.Linux gcc/g++出来的二进制程序,默认是release模式
3.要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项,如下,可以生成blogtest的debug执行文件,我们可以进行调试了
4.我们进行调试时,可以打多个断点,再两个断点直接看代码运行是否有错误,以此进行范围排查。
gdb blogtest命令后即可进入gdb调试之中,gdb会记录我们最近一次执行的命令,以下是开始调试需要我们执行的命令。
(1)l(ist) 1 ,我们可以显示文件中的代码,从第一行开始,然后回车不断向后显示
(2)b 13,b test.c:15,b Sum,给指定行或者函数加入断点,info b查看所有断点,d 1 ; d 2可以删除第一个,第二个断点。disable 3,禁用三号断点,enable启用。
(3)r命令之后gdb跑起来了,后面我们如何进行vs下的逐语句(F11,进入函数),逐过程(F10),n 命令就是逐过程,s就是逐语句。
(4)显示变量。p i 或者p &sum可以查看变量。而如果需要常显示,display a ,display b
而需要取消undisplay 1,undisplay 2这样取消常显示。
(1)会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
(2)makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
(3)make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
(4)make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
?make会在当前目录下找名字叫“Make?le”或“make?le”的文件。
我们写下如下的makefile文件:注意过程是反向的
hello:hello.o
gcc hello.o -o hello
hello.o:hello.s
gcc -c hello.s -o hello.o
hello.s:hello.i
gcc -S hello.i -o hello.s
hello.i:hello.c
gcc -E hello.c -o hello.i
如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
当然,你的C文件和H文件是存在的啦,于是make会生成hello.o文件,然后再用hello.o文件声明make的终极任务,也就是执行文件hello了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
?make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
工程是需要被清理的,我们需要clean,我们在刚刚的makefile文件加入如下代码:
.PHONY:clean clean:
rm -f hello.i hello.s hello.o hello
像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
知识储备:
1.Linux下C语言对I/O函数提供了一个缓冲区,它是内存的一段空间,CPU只能与内存打交道,当我们printf(scanf)时候,只能先把数据放在缓冲区,再由缓冲区刷新到外设(cpu从缓冲区读取)
2.换行与回车。换行实际是光标到下一行的同一个位置,回车是回到一行的最开始。Enter键和\n都是换行和回车的结合使用,而\r只是单独在显示器上回车但是不换行.
3.\n在打印时会刷新缓冲区,\r不会,同时fflush(stdout)会刷新缓冲区
实现:先编写makefile文件,这是一个多文件编译的makefile文件
运行即可看到一个简易的进度条小程序了。目的是为了熟悉以上工具的使用。
之前的第一篇博客中有提到git在windows下的使用,下面我们讲讲在Linux平台下的简单使用,和windows下基本一致。
git是一个版本控制器,它也是个工具,我们的代码写好之后,可能后面会更改迭代版本,为了记录每次版本改变了什么,就可以使用git,它会帮我们储存和管理代码。它也拥有多人协作功能,下面简单讲讲如何使用git。
(1)git clone + 你在gitee/github 中克隆下载的地址,这条命令会把远端仓库和代码复制到本地来
我们使用ll -a查看这个文件夹下有什么东西,这个目录就是我们的当前工作区,我们可以在这个目录下实现git的各种操作。
其中.git就是我们当前的本地仓库,进度条是我之前提交过的 代码.gitignore就是你add时会忽略的东西,这些东西不会被提交到本地仓库。
(2)git add .
我们将刚刚的写的进度条小程序拷贝到当前目录下之后,git add .即可将选择的文件( .表示这里是当前目录下的所有文件)提交到工作区中
(3)git commit -m “ ”
之后git commit -m"我的进度条小程序"即可提交代码到本地仓库,提交的时候应该注明提交日志, 描述改动的详细内容
(4)git push
执行git push就可把我们本地仓库代码同步到远端仓库(gitee)中.
git还有一些命令,这里不再多写,这几条足够在学校的我们使用git了.