【Linux】常用工具的使用

        像vs2019这样的编译器是集成编译器,是集合了编辑器,编译器,和Debug为一身的工具,但是在Linux是分开的,编辑器就是编辑器,编译器就是编译器,和Debug的工具。虽然不好用,但是要学会如何使用。


一、vim(编辑器)

        vim有三种比较基础的模式:普通模式、插入模式、低行模式

        在普通模式下按 i 进入插入模式,只有在插入模式下才能进行文字的输入,按ESC可以返回普通模式。

        在普通模式下 按 shift+: ,进入低行模式,可以进行文件的保存和退出,也可以进行文本的替换,查找字符串。

        底行模式跟平时在Linux下写指令一样,也可以记住历史输入过的指令。

vim常见命令:

        打开一个文件直接使用 vim + 文件名,如果没有此文件也可以进入!保存退出后会自动生成这个文件,所以要注意有时候打开文件的时候,发现是空的要去看看是不是文件名打错了!!!

        打开文件后非常常用的两个操作:w(保存),q(退出),!(强制)。可以单个操作也可以一起使用,需要在插入模式下才能使用。

光标:        

        

        光标的移动可以使用键盘上的方向键,但是vim默认的移动键是 h(左),j(下),k(上),l(右)。

PS:巧记键盘最左 h,键盘最右 l,jump(往下落),king(王在上)。

gg:光标定位到文件最开始。

shift + g(大写的G):光标定位到结尾。

PS:这两个命令很有用,这里要说明一下,在vim编辑文件的时候,是不能用鼠标滚轮来翻页的!

shift + 6 (^):将光标定位到当前行的最开始。

shift + 4 ($):将光标定位到当前行的结尾。

w,b:以单词为单位进行光标的前后移动。  

yy:从光标开始的位置,复制光标所在行。在命令前面加上数字可以进行多行复制,比如 6yy 就是从光标位置复制6行。

p:把复制的数据粘贴到光标所在位置。

dd:将当前光标位置的行剪切(也可以当删除使用)。

shitf + ~:把选中的字符进行,大小写切换。

shift + r(大写的R):替换模式,在不删除字符的情况下,输入新的来替换,按ESC退出。(不是很好用,还要切换模式,不如删了重写)

单输入一个 r:单替换光标处的一个字符。前面输入数字,可以多个字符一起替换,6r就是替换6个字符。

x 或者 (shift+x):小写的x是删除光标当前字符,大小的X是删除光标前面的字符。前面可以加数字删除多个字符。

u:撤销操作,可以当做平时用的Ctrl+z。

ctrl + r:撤销 u 的操作。(撤销撤销操作,但是注意不能撤销自己的操作,撤销自己的操作还是用 u )

底行命令:

set nu/nonu:开启行号,或者取消行号。

vs:开启对比模式(分屏,光标在哪里操作就在哪里),输入q可以退出分屏。 

ctrl + ww:分屏模式下跳转光标。      

拓展:

        vim的操作指令非常多,死记的话也比较难记,建议熟练掌握增、删、改、查就可。 

         vim需要在文件进行配置,像输入一个字符就给出可能要的函数这种辅助功能,都需要自己设置。

         不过这里设置起来很麻烦,学习成本也高,而且没多大用,可以使用网上已经有的开源配置。

VimForCpp: 快速将vim打造成c++ IDE

        只需要输入一行命令即可, 方便快捷,记得给星给好评。

二、g++(编译器)

        这里要注意gcc是一个专门用来编译连接C语言程序的编译器。而g++是c++的,g++可以用来编译c语言,反之则不行。

        gcc -v,g++ -v 查看版本

程序的编译流程:

程序的翻译:

    

gcc mytest.c -o test 

        这里是直接把源文件生成一个可以执行文件test,省略了其他步骤。也可以分解开来观察区别。

gcc -E mytest.c -o mytest.i

        把代码预处理的结构生成到 mytest.i 文件里面

-E:从现在开始进行程序的翻译,如果预处理完成就停下来。

         这里是预处理后的文件,完成了头文件展开、去注释、宏替换

gcc -S mytest.i -o mytest.s

-S:从现在开始开始进行程序的翻译,如果编译完成就停下来。

        生成一个代码转化为汇编的文件。

gcc -c mytest.s -o mytest.o     //.o是可重定位目标文件

        进过汇编后,生成的二进制文件。这个文件不能直接运行。

-c:从现在开始进行程序的翻译,如果汇编完成就停下来。

 

         全是一堆看不懂的二进制代码。

gcc mytest.o -o mytest

        程序的链接,生成可执行程序mytest。

 PS:巧记方法ESc是键盘最左上角的按键,iso是镜像文件后缀。

makefile:

        在Linux下如果每次编译一个文件,都要输入如此多的指令,麻烦而且效率低下,那么这里可以使用makefile来帮忙减少劳动量。

        make是一个命令,makefile是一个文件,里面写的就是上面编译连接的指令。一般用的少,主要要学习自动构成makefile的工具,比如Cmake。

编写makefile:a、依赖关系 b、依赖方法

        可以直接使用vim来编辑Makefile。 

        

        mytest:mytest.c 就是依赖关系gcc mytest.c -o mytest 就是依赖方法。下面的clean是伪目标,一般写的是删除文件的指令。

        

        这里输入make命令就相当于输入了编译链接的指令,会进行程序的编译链接。而输入make clean就可以执行删除的指令,来删除生成的可执行文件。

拓展:

        但是要注意,伪目标总是被执行的,每次make clean都会执行方法。而make指令,如果没有发现程序有改动是不会执行方法的。

makefile是如何知道可执行程序改动过?      

        根据ACM来判断的:A:访问时间 M:修改时间 C:修改属性的时间

        makefile检查源文件和可执行程序的时间,如果源文件时间比可执行程序晚了,说明改过源代码,这时候就可以重新生成可执行程序。

        如果检查到可执行程序的时间比源文件要晚,说明现在就是最新的,就不能重新生成。

多文件编写:

        这里生成两个文件test.c、test.h,然后生成一个文件main.c在里面调用test.c里面的函数。

 

 

        编写Makefile,这里不用注意顺序,会自己去先执行能执行的。这里生成先生成二进制文件,再链接到一起生成可执行程序mytest。

         执行检查一下没有问题。

拓展:动静态库

        在CentOS7里面,库文件在/lib64目录下面,一般访问库有两种方式:1、动态库。2、静态库。

        在Linux系统中的文件后缀,.so(动态库) 、 .a(静态库),而在windows系统性中,.dll(动态库)、.lib(静态库)

动态链接:使用动态库里面的方法的时候,需要库文件。占用资源少。

静态链接:将库中的方法的实现,拷贝到我们的可执行程序中!编译好就可以不库文件了。但是占用资源比较多。

        Linux一般默认使用的是动态链接生成可执行程序。如果要变成静态链接,生成可执行程序的时候,加上-static:使用静态链接的方式生成可执行程序。

gcc test.c -o mytest-s -static

PS:一般云上的机器不带静态库,要自己去下载。

sudo yum install -y glibc-static #C静态库

sudo yum install -y libstdc++-static #C++静态库

三、gdb(调试器)

        写代码难免会发生错误,在vs2019中有报错信息,还可以进行调试,但是在Linux下想调试要单独调试,这里使用的调试器就是gdb。

PS:程序的发布方式有两种debug和release,gcc/g++编译出来的程序默认是release模式的,如果要进行程序的调试,要使用debug模式。

gcc mytest.c -o mytest -g     //加上-g就是以debug方式发布的
readelf -S mytest|grep -i debug   //查看程序是不是debug模式的

         如果是release模式不会出现信息,如果是debug模式会出现以下信息。

        使用 gdb+程序名 直接开始调试程序。

 常用命令:

q(quit):退出调试。直接使用快捷键ctrl+d也可以退出。

l(list):可以加数字,list 0就从0行开始打印10行代码。

r(run):开始调试,如果没有设置断点,会走完程序(真在调试的时候,再次按r会重新回到打断点的地方重新开始调试) 。

b(break):可以加数字,b18就是在18行打断点。不过这里不能看到在哪里打上了断点。

info b:查看断点。

PS:这里断点是有编号的,好用来区分。这里打了一个断点,编号就是1。

d (delete) :d 1,就是删除编号为1的断点。注意后面跟的数字是断点的编号。

n(next) :调试程序,单步步过。(就像vs2019里面的F10)

s(step):调试程序,单步步入。(就像vs2019里面的F11)

p + 变量名:打印变量内容。()

finish:将当前函数跑完,然后停下来。进入到一个函数内部的时候,可以使用这个指令快速走完这个函数。

display:设置长显示,跟踪一个变量,每次停下来都显示一下变量内容。(作用比较像vs2019里面的监视变量。每设置一个变量也会给一个编号,跟断点一样。)

undisplay + 编号:取消长显示。

until + 行号:跳转程序到指定行。

c (continue):运行之下一个断点处停下来。(如果打了多个断点)

disable/enable + 断点编号:关闭或开启指定编号的断点。(不删除断点)

 

        gdb非常不好用,看个代码还有长度的限制,如果一个项目代码多,使用起来非常麻烦和不方便,

四、yum(下载器)

        前面几个软件,有的在别的版本的系统上可能没有,所以要去自己下载,那么就跟平时在windows系统下下载软件一样,需要下载的工具,而在Linux下可以使用yum。

        然后yum有时候下载软件会发现没有下载速度,有时候始终为0,这是因为yum的源使用了外网的源,而中国网络上有墙没法很好的访问外网,这个时候就要把源设置为国内一些开源的源。

        而yum的源就是一个配置文件,位置:/etc/yum.repos.d

        

sudo vim /etc/yum.repos.d/CentOS-Base.repo

 

         我这里就是腾讯的源,也可以使用其他的源。

yum三板斧:

yum list  //把能下载的软件罗列出来。

yum search sl  //把有sl的字符的软件搜索出来

yum list|grep sl 
yum install  //下载软件

yum install  -y sl.x86_64   //加个-y,表示不要询问

yum remove //移除软件

五、git(版本控制器)

        非常常用且好用的工具,可把写的代码保存到网上的仓库中,方便方便代码的保存和下载。        

        为何叫版本控制器呢?这是因为在工作中,需要多人协作修改编写代码的,而git这个工具可以把一个项目分成多个分支,最后检查代码没问题后,再把代码合并到主分支里面去,而且如果代码还是有错误,还可以进行版本的回溯。

        这里可以使用Github来保存项目,也可以使用gitee(码云)。去注册好账号后,新建一个仓库。

 

        然后要需要这里仓库的地址

        最后在git里面添加码云的邮箱和密码。

//设置用户名
git config --global user.name "username"

//设置邮箱 (没有双引号)
git config --global user.email [email protected] 

//查看用户名和密码
git config user.name
git config user.email

//查看其他配置信息(git设置列表)
git config --list   

打开.gitconfig增加配置信息:

[credential]
    helper = store

在项目根目录执行命令:

git config --global credential.helper store

        执行git需要输入账号密码的命令时会提示输入密码,此时密码会记住,以后再执行类似操作则不需要输入。

git clone + 自己仓库的地址        //下载仓库到本地

        再把刚刚新建的仓库下载到系统下,把自己写的代码放到仓库里面就可以上传保存了。

git三板斧:

git add + 你的软件     //添加文件到你的目录 

        提交项目。

git commit -m "这里必须写提交日志"

        提交改动到本地,日志一定要写清楚,不用在乎长度,写上改动的详细内容和日期,方便别人看你项目的时候知道你干了什么。

git push   //提交

        同步到远端服务器。

         第一次要输入账号密码。

拓展:

git log //提交记录  

 

         注意要在仓库文件夹里面才能查看提交记录。

git pull   //有时候无法提交,会出现提交冲突

        把远程仓库里面的代码与本地的代码进行合并。

git rm +你的软件   //删除文件,但是git仓库里面不会删除

.gitignore        这个文件里面写的不会被提交到仓库里面,项目里面有些文件不是必须上传的,所以这里添加上不需要上传文件的后缀,减少要上传的空间压力。

​​​​​​​


猜你喜欢

转载自blog.csdn.net/weixin_45423515/article/details/126713660