文章目录
- 一、Linux 软件包管理器 yum
- 二、 Linux开发工具
- (1) Linux编辑器-vim使用
- (2)简单vim配置
- 三、Linux编译器-gcc/g++使用
- 四、动态库和静态库
- 五、Linux调试器-gdb使用
- 六、Linux项目自动化构建工具-make/Makefile
- (1)make/Makefile介绍
- (2)make/Makefile具体使用
- (2)make原理
- (3)\r&&\n
- (4)进度条小程序实现
- 七、使用git命令行
一、Linux 软件包管理器 yum
软件包:
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。
yum使用:
(1)yum list | grep 软件包名字:可以查看软件包,它的组成是: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构。如下图:
- “x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.
- “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6.
- os 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店” 这样的概念.
yum -y install 软件名字:可以安装软件,如果是普通用户需切换root,或者在前前面加sduo即可。
yum -y remove 软件名字:卸载软件,使用同上。
yum源:
应用商店及软件管家需要知道各个软件的下载地址,通过网络的方式去对应的服务器找软件才能下载,一般都内置下载链接的地址,yum也需要,它也有自己的配置文件,称为yum源。在根目录/etc/yum.repos.d/路径下。
更新yum源:只需要四个步骤 - 先进行备份老的yun源 Centos-base.repo
- wget 命令来获取新的yum源配置文件(从远程获取url资源的命令)后面跟新的yum源配置文件路径,可以去搜链接,如163的:http://mirrors.163.com/.help/CentOS7-163/repo。
- mv 重命名成为Centos-Base,repo
- yum clean&& yum makecache:清理老的的缓存并生成新的缓存。
扩展软件:
如果安装的软件没有,因为服务器上对应的软件分为官方软件和扩展软件,所以就可能在扩展的yum源中只需要sudo yum -y epel-release。可以根据自己的base yum源,找到和它匹配的扩展yum源。
二、 Linux开发工具
(1) Linux编辑器-vim使用
编辑模式:
vim是一款多模式的编辑器,有各种模式,每种模式可以互相切换,先介绍五种。
(1)命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式下,或者到底行模式。
(2)插入模式:只有此模式下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是最频繁的编辑模式。
(3)底行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模
式。要查看你的所有模式:打开vim,底行模式直接输入help vim-modes。
(4)替换模式:直接按shift +r 可以替换当前光标下的字符。
(5)视图模式:在底行模式输入 vs +文件名可以多文件分屏编辑,ctrl+ww可以进行文件切换。
如图:
vim命令集:
插入模式:
(1) 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;
(2) 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
(3 ) 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
命令模式:按esc进入
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
按「G」:移动到文章的最后
按shift+「 $ 」:移动到光标所在行的“行尾”
按shift+「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
n shift [g]:将光标定位到文档的指定行
按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页
「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「nX」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「dd」:删除光标所在行
「ndd」:从光标所在行开始删除n行
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「nyw」:复制n个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「nyy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
[n pp]:粘贴n行内容到指定的光标下
[u]:撤销刚刚的操作
[ctrl+r]:对撤销进行撤销
[shfit ~]:快速大小写切换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
「cw」:更改光标所在处的字到字尾处
「cnw」:例如,「c3w」表示更改3个字
「ctrl」+「g」列出光标所在行的行号。
「nG」:例如,「15G」,表示移动光标至文章的第15行行首。
底行模式:先exc 在shift+:进入
「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。
「n」:「n」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字1,再回车,就会跳到文章的第1行。
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
[%s///g]:将单词进行替换
[!+命令]:可以不用退出vim 进行命令执行,再按enter可以立即返回vim
替换模式:先esc 再shfit+r 可以替换当前光标下的内容。
视图模式:先进入底行模式,再vs +文件名可以分屏编辑文件,光标在哪就在哪一行编辑,ctrll+ww切换不同界面。
(2)简单vim配置
配置vim就是为了写代码以及编辑内内容等操作起来时方便而且有美化界面,快速注释功能,模板补全功能,工程浏览功能,代码补全功能。分为手动配置和自动化配置。
手动配置:
可以自己配置,vim在启动的时候,会自动在当前用户的目录下,寻找配置文件,如果没有就是默认。先创建.vimrc,在里面进行增加指令进行配置(指令可以在网上搜索)。
自动化配置:
这种方法非常适合我们新手使用,是大佬们针对我们这种对vim配置方法不熟悉的新手封装的一键式vim环境安装包. 主要用在终端vim用户, 目前只支持centos 7版本。如何配置:在自己的普通用户后面输入:curl -sf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh 后面会再让你输入root用户密码也就是超级用户 就可以直接自动安装了如图:
三、Linux编译器-gcc/g++使用
gcc,g++在linux中是一个编译器,可以把对应的c代码和++代码进行编译,对于一个.c的源程序,gcc把它最终编译成一个可执行程序分为四个步骤。
(1)预处理
q.i是目标文件,q.c是被执行的文件,也叫做依赖文件。
- 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
- 预处理指令是以#号开头的代码行。
- 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
- 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
(2)编译
q,s是目标文件,q,i是依赖文件 - 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
- 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
(3)汇编
q.c是目标文件吗,q.s是依赖文件
- 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
- 在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
(4)l链接
在成功编译之后,就进入了链接阶段。生成可执行程序如图:
四、动态库和静态库
在C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用
那可以总结说库是写好的可以复用的代码并且是成熟的,因为链接方式不同可以分为静态库和动态库。
(1)静态库
在链接阶段时,编译器会将汇编生成的目标的文件与所要用到的库一起链接打包到可执行文件中,也就是将所需要的库中的代码拷贝到程序中,这叫做静态链接,被拷贝的库叫静态库。静态链接成功,程序不再依赖任何库,自己可以独立运行。静态库文件格式是ibxx.a。
(2)动态库
在链接成功后的可执行程序会存一个指向库的地址,在程序运行时才会去读取库函数使用,这叫做动态链接,被链接的库叫动态库,也叫做共享库。动态链接成功后,程序还是依赖动态库。如果动态库消失,程序无法正常运行。动态库文件格式是libxx.so。
(3)优缺点:
静态库优点:编译链接成功的可执行文件可以独立运行,不再需要向外部索要函数库的内容。
静态库缺点:库更新时,需要重新编译链接,可执行程序的文件比较大。
动态库优点:因为可以被共享,真正的实现永远都是在库中,程序内部只有地址,就可以实时链接最新的库,可执行文件小,节省空间。
动态库缺点:无法单独运行,必须保证能够链接到库。
(4)linux环境下默认使用的是动态链接和动态库
如果需要静态链接,在链接时后面加上-static,静态生成的可执行程序比动态大得多。可以通过两条指令file和ldd来查看它们的链接方式和库。
file+可执行程序名称:这条指令可以识别文件类型,还可以辨别一些文件的编码格式。
ldd+可执行程序名称:可以列出动态库依赖性关系,去掉.so及后面的和前面的lib ,中间的就是动态库的名称。如lib.c.so.6,动态库的名称是c。
五、Linux调试器-gdb使用
程序的发布方式有两种,debug模式和release模式,Linux gcc/g++出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。
(1)调试指令
正式调试指令:gdb+程序名称如图:
具体调试指令:gdb有记忆功能,按上下方向键可以查看历史指令,以前输入的指令。
r:运行代码
l+行号/file:行号/函数名:列出代码
n:逐语句
s:逐过程
b+行号:在指定行上打断点
d+断点编号:删除断点,不指定编号删除所有断点
info+b:查看所有断点信息
enable breakpoint:开启断点
disable breakpoint:关闭断点
c:跳转下一个断点
display:长显示如内置类型,结构体等自定义类型,stl
undisplay:取消长显示
until 行号:在函数内使用,进行指定位置跳转,执行完区间代码
finish:进入一个函数,把一个函数跑完,停下来
p +变量:查看变量的值
set var:修改变量的值
退出调试指令:quit或者ctrl+d
(2)查看调试指令信息
指令:readelf -S 可执行程序名 | grep debug
readelf指令一般用于查看ELF格式的文件信息,如在linux下的可执行文件,静态和动态库等包含ELF格式的文件,-S选项是显示节头信息。如图:
六、Linux项目自动化构建工具-make/Makefile
(1)make/Makefile介绍
1.1 make/Makefile概念:
make是一条命令,用来解释makefile中指令的命令工具,makefile是一个文件,两个搭配使用,完成项目自动化构建。大多数的IDE都有这个“make”命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
1.2 使用背景:
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力,如果遇到很多个源文件需要编译和链接时,运行时用gcc得把所有的源文件名字写在一起,检查起来很麻烦,可以把编译的指令存在Makefile/makefile文件里统一管理,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
1.3使用优势:
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
(2)make/Makefile具体使用
1、先创建一个源文件在里面写入代码如图:
2、再创建一个Makefile/makefile文件:进入到文件写入内容:
第一行是依赖关系:以冒号为分隔符,左面w是目标文件,右边是生成目标文件所要的依赖文件。
第二行是依赖方法:先以tab开头,后面写入具体的操作方法,gcc正常编译的指令。
2.1 执行顺序:
整体是从上往下执行,先看依赖关系中的依赖文件是否存在。如果存在就执行对应的依赖方法,反之不存在就跳过依赖方法继续往下找生成依赖文件的依赖关系和依赖方法,生成前面指令想要的依赖文件,生成后再回来执行指令。如果有多个文件和头文件,头文件不必写,只要其他源文件包含了它,系统会自动到当前目录下找自己写的头文件来连接。
3、清理工作:
在里面还以写入用来清理生成的可执行程序或目标文件的命令,可以快快速清理和重编译源代码,一般这种命令被设置为伪目标,用.PHONY修饰。
接着给目标文件取名为clean,它不需要依赖文件,因为执行的是第五行的依赖方法。在外面执行命令只需输入 make clean就可以清除所有的目标文件。
3.1 伪目标:意思是总是被执行的,.PHONY是makefile的一个关键字,用来修饰目标文件,表示任何时候都可以被执行。即便没有对应的文件。如下:
第一次make时候执行指令,再按make不能再执行了,如果想让他再次执行在Makefile文件里加上.PHONY后面跟目标文件。如图:
这样就可以总是被执行。
3.2 make是怎么知道当前形成的可执行程序是最新的:软件生命周期有两条线,一个是源代码线,一个是可执行程序线,正常开发先有源代码,再有可执行,如果可执行程序的时间(最近修改时间)比源代码修改时间晚一些,说明可执行程序是最新的,在make的时候不再让执行了,而源代码当前是比可执行程序的时间早,说明源代码没有修改过即老的。
所以是否需要重新编译执行,通过对比时间来进行即最近修改时间。
如何再次执行:
- 先用stat查看源文件和可执行程序文件的时间。
- 再直接touch +原来的源文件可以修改时间就可以让make再次执行。
(2)make原理
如上:
- . make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件,在上图中,会找到“w”这个文件,并把这个文件作为最终的目标文件。
- 如果w文件不存在,或是w所依赖的后面的q.o文件的文件修改时间要比hello这个文件新,那么,他就会执行后面所定义的命令来生成w这个文件。
- 如果w所依赖的q.o文件不存在,那么make会在当前文件中找目标为q.o文件的依赖性,如果找到则再根据那一个规则生成q.o文件。
- C文件和头文件是存在的,make会生成 q.o 文件,然后再用 q.o 文件声明make的终极任务,也就是执行文件w了。
- 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
- make只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那就不工作。
(3)\r&&\n
\r和\n是c语言的控制字符。
\r:是回车的意思,将光标重新回到本行开头。
\n:是换行的意思,将光标换到下一行,不一定到下一行行首,在c语言中有换行并到行首的功能。
行缓冲区:在I/O操作,输入输出如果遇到换行符\n时,进行真正的I/O操作,此时自己的输入的内容先放在缓冲区,等按下回车换行时才进行实际的I/O操作,但对于行缓冲,每一行缓冲区的长度是固定的,只要填满缓冲区,没有遇到换行符,也会刷新缓冲区。
如下例子:
带有\n时直接打印出字符。再睡眠2s,最后退出程序。
而不带\n时。先睡眠2s。最后打印字符,最后退出程序。
第一个出现了字符,这就验证了换行符刷新了缓冲区。第二个没有出现字符,说明字符在sleep期间被保存起来了,也即是缓冲区。如果想让它不带换行符就打印出来,可以在后面加一个fflush(stdout)手动刷新缓冲区。
(4)进度条小程序实现
1 #include"pro.h"
2 #include<string.h>
3 #include<unistd.h>
4 #define N 101
5 #define sym '#'
6 void ProcessBar()
7 {
8 const char *lab="|/-\\";
9 char bar[N];
10 memset(bar,'\0',sizeof(bar));
11 int i=0;
12 while(i<=100)
13 {
14 printf("[%-100s][%d%%][%c]\r",bar,i,lab[i%4]);
15 fflush(stdout);
16 bar[i++]=sym;
17 usleep(100000);
18 }
19 printf("\n");
20 }
1、先用宏定义一个N表示数量,另一个sym表示进度条的字符,以方便修改。
2、再把数组每个空间都置为0,再用while循环一百次,打印字符和百分比和加载图案。
3、%-100s预留出100个空间,从左到右打印,打印加载符号的时候,先用字符指针存4个字符的首地址,因为循环100次,而一共就有4个字符,就要取模。
5、当每一次打印的时候要想让它回到当前行的最开始,不要换行需要加上\r,而加上\r字符不能从缓冲区刷新出来,所以后面加上fflush来刷新缓冲区。
结果如图:
七、使用git命令行
git是一个开源的分布式版本管理系统,最常用的功能是我们可以从服务器上克隆完整的git仓库到本机上,并在自己的本机上根据不同的开发目的,创建分支,修改代码,最后可以提交到代码托管平台如github,gitee。在国内经常使用gitee。
具体使用:
一、clone仓库到本地
现在gitee创建一个仓库,点击进入仓库,点克隆下载,复制HTTPS即url,在linux下输入指令:git clone url。本地仓库创建完成。
二、提交代码至远端
复制要提交的代码到本地仓库。之后分为3个步骤:
- git add .把我们拷贝的文件添加到仓库里的一个暂存区。
- git commit -m “ 写有用的信息” 。这个提交是真正的提交,把对应的修改内容提交到当前分支。
- git push 把代码推送到远端,让本地仓库和远端仓库保持一致。此时远端仓库就有了刚才的提交的文件。
- git log 可以查看日志,可以看以前的提交的信息及提交记录
- git status:查看本地和远端之间的同步状态
- git rm 文件名:删除远端的文件,后面还需要重复以上三个步骤就可删除远端的文件
刚开始commit的时候可能会出现下面这种情况:
填写一下邮箱和你的用户名,把上面的两行代码输入到命令行中,在引号里面写入用户名和邮箱就能解决。
三、git add 和commit的区别
需要明白三个概念:工作区,版本库。暂存区
当在开一个工程项目时,主目录使我们的工作区,有一个隐藏目录git,这个就是git的版本库,里面存了很多文件,包括暂存区,还有一个git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD。
git add:把文件添加进去,实际上把修改添加到暂存区
git commit:提交更改,把暂存区所有内容提交到当前分支,也即是往git为我们创建的master分支上提交更改。
简单来说,就是需要提交的文件修改都先放在暂存区,最后一次性将暂存区的所有内容提交到分支上。