0


[Linux]常见环境开发工具

●🧑个人主页:你帅你先说.
●📃欢迎点赞👍关注💡收藏💖
●📖既选择了远方,便只顾风雨兼程。
●🤟欢迎大家有问题随时私信我!
●🧐版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究。

📌📌📌为您导航📌📌📌

1.Linux 软件包管理器 yum

1.1什么是软件包

  • 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
  • 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包>(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的>软件包, 直接进行安装.
  • 软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.
  • yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主>>要应用在Fedora, RedHat, Centos等发行版上.

1.2Linux下怎么安装/卸载软件

Linux下有三种安装软件的方式:
1.源码安装
2.rpm(已经编译的软件包)安装
3.yum安装
我们在安装时可能会存在软件之间的依赖关系,安装非常麻烦,所以前两种方法我们通常不使用,而是使用第三种方法安装,

  1. yum

本身会考虑依赖关系。
在手机上我们需要下载软件可以从应用商店里搜索对应软件,Linux上也有这种

  1. 应用商店


在Linux中输入

  1. yum list

就会列出linux上能安装的所有软件。
在这里插入图片描述
找到对应的软件名然后

  1. yum install xxx

软件就安装上了
如果不想要这个软件了,可以

  1. yum remove xxx

这样软件就卸载了。

2.vim

在这里插入图片描述

vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插 入模式(Insert mode)和底行模式(last line mode)。

  • 正常/普通/命令模式(Normal mode) 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
  • 插入模式(Insert mode) 只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
  • 末行模式(last line mode) 文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模 式。要查看你的所有模式:打开vim,底行模式直接输入。在这里插入图片描述
  • 进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:
  • $ vim test.c
  • 不过有一点要特别注意,就是你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字
  • 退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:
  • : w (保存当前文件)
  • : wq (输入「wq」,存盘并退出vim)
  • : q! (输入q!,不存盘强制退出vim)

2.1vim命令模式常见命令

光标相关
k(上)j(下)h(左)l(右)
shift + ^(跳到行首)
shift + $(跳到行尾)
gg(跳起始行)
shift + g(跳到结束行)
n + shift + g(跳到第n行)
b/w:按照单词为单位进行前后光标移动
文本操作:
yy:复制当前行
nyy:复制当前行及其之后的n行,包括当前行
u:撤销误操作
p:粘贴
np:一次重复粘贴n行
dd:删除当前光标所在行,支持ndd
dd->p:剪切功能
shift + ~:快速切换大小写
x:从左向右删除光标之后的一个字符,支持nx
X:从右向左也是支持nX
r:替换一个字符,光标所在的字符,支持nr
shift + r:替换模式,直接进行多个内容的替换
ctrl+r:撤销最近的撤销
底行模式
set nu:调出行号
set nonu:取消行号
w:保存
q:退出
!:强制操作

3.gcc/g++编译器

gcc

C语言阶段,我们学过程序执行过程的几个阶段。

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

在Linux中,我们可以查看预处理的过程

  1. gcc -E test.c -o mytest.i
  2. //开始进行翻译(四个过程统称为翻译),完成预处理之后,停下来,把预处理的结果放入mytest.i文件

在这里插入图片描述
查看编译的过程

  1. gcc -S test.i -o test.s

在这里插入图片描述
查看汇编过程

  1. gcc -c test.s -o test.o

在这里插入图片描述
打开后你会发现全是乱码。这是因为不是以二进制的形式打开的,但这些都不重要。汇编形成的二进制文件,并不可以直接执行,它是一种可重定向目标文件。

计算机可以直接执行汇编语言吗?汇编语言需要编译吗? 不可以。需要。

我们知道,每个语言都有自己的库(一套头文件+一套库文件(libc.a,libc.so))。程序通过链接来将我们自己代码中的函数调用,外部数据和库关联起来。
查看链接过程

  1. gcc -c mytest.s -o mytest.o

在这里插入图片描述
相信有人会有疑问,为什么C程序的翻译是这个过程?
我们早期编程使用的是二进制编程(打孔编程)
在这里插入图片描述
后面人们发现用二进制编程效率实在是太低了,所以就有了汇编语言(助记符),但汇编语言最终还是得翻译成二进制,所以就有了编译器,但汇编语言相对来说还是太复杂了,所以C语言就诞生了。

我们要如何理解链接?
Linux中有静态库(.a)和动态库(.so),它们都与程序能否成功运行有关,所以链接过程其实就是程序与第三方库提供的方法关联起来。链接中又分为静态链接和动态链接。动态链接简单来说就是,比如你执行程序,你需要调用库函数printf,然后程序就会和库建立联系,在库中执行然后再把结果返回给程序。静态链接就是把库中的代码直接拷贝进我的可执行程序中。
在这里插入图片描述
通过命令显示,我们发现gcc默认采用动态链接方式,形成可执行程序。

g++

g++的基本操作和gcc基本一样,在这里不再赘述。
我们知道,C++是兼容C的,所以g++也可以编译C语言程序,但一般我们不建议这样做。

4.Linux调试器-gdb

在学习C/C++中,如果代码有问题,我们可以设断点调试,在Linux中,如果说

  1. vim

是编译器,那么

  1. gdb

就是调试器。

  1. gdb 文件名

在这里插入图片描述

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后停下来等待命令
  • print( p ):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • continue(或c):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

这个时候还不能调试,如果你输入命令,它会报错
在这里插入图片描述
为什么会报错?
因为如果一个程序是可以被调试的,该程序的二进制文件一定加入了一些debug信息。
我们C语言阶段介绍过程序有debug版本和release版本,release版本会比debug版本更小,就是因为release版本没有加入调试信息。这样我们就理解了,Linux中形成的程序默认情况下是release版本。
添加调试信息

  1. gcc test.c -o test -g

在这里插入图片描述
现在程序就可以调试了。
如果你是在for循环里定义变量,可能程序会报错,因为这种写法是从C99开始的。
在这里插入图片描述
这时候只需要在原来命令后面加一个

  1. -std=c99

  1. -g

也要加,不加不能调试。
以下命令只在调试模式下有效
打断点

  1. b 行号

显示断点

  1. info b

删除断点

  1. d 行号

禁用断点

  1. disable 行号

启用断点

  1. enable 行号

逐过程调试

  1. n

显示值

  1. display 变量名

删除监视的变量

  1. undisplay 编号

在这里插入图片描述
此时我想删除

  1. &sum

这个变量
在这里插入图片描述
直接输入变量名是会报警告的,必须是它的编号。
进入函数

  1. s

这个命令类似于vs编译器的逐语句,可以进入函数内部进行调试。
结束函数

  1. finish

这个使用场景就是当你进入了你自定义的函数后,然后你想退出就可以敲这个命令。
到达下一个断点

  1. continue

跳到某行

  1. until 行号

查看调用堆栈

  1. bt

5.Linux项目自动化构建工具-make/Makefile

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

在这里插入图片描述
先创建一个

  1. Makefile

文件,输入图中的命令。
然后make
在这里插入图片描述
然后你就发现里面写的命令被执行了。
还可以再写一条清楚可执行程序的命令。
在这里插入图片描述
然后

  1. make clean

在这里插入图片描述
可执行文件就被删除了。
可能有人会疑问,为什么生成可执行程序只需要一个

  1. make

,而删除却要

  1. make clean


因为make扫描Makefile文件的时候,默认只会形成一个目标依赖关系,一般是第一个。
也就是说如果你把clean的命令写在前面,再make就会执行刚刚

  1. rm -f test

的操作。

  1. .PHONY:

是一个伪目标(总是可执行的),修饰对应的符号。
在这里插入图片描述
我们发现,make了一次后就无法make了,这是因为系统会去检测你的代码有没有改变,如果没有,就不会重新编译,但如果是一个伪目标,比如刚刚的

  1. make clean

,不管执行多少次都可以,因为它总是可执行的。
刚刚的命令还可以简写成

  1. test:test.c
  2. gcc -o $@ $^
  1. $@

代表

  1. test

  1. $^

代表

  1. test.c

6.进度条

我们在使用电脑时,经常会说到

  1. 回车换行

,但你有想过

  1. 回车

  1. 换行

是两个概念吗?
回车指的是

  1. 回到当前行的最开始。

换行指的是

  1. 列不变,新起一行。

我们来看段代码

  1. #include<stdio.h>#include<unistd.h>intmain(){printf("hello world!");sleep(5);return0;}

执行这段代码时,你会发现一个你无法理解的现象,程序运行时,并不是马上输出,而是停了一会,那这样是不是说明程序是先执行sleep再执行printf?
显然不是。原因是因为虽然printf已经执行,但是数据没有立即被刷新到显示器当中!
没有’\n’,字符串会暂时保存到C语言级别的缓冲区中,显示器设备的刷新策略就是行刷新,即遇到’\n’才会进行刷新。

C程序,会默认打开三个输入输出流
stdin,stdout,stderr
键盘 显示器 显示器
注意:从显示器上显示的都是字符,从键盘读取的内容也都是字符。
在这里插入图片描述
刚刚那段代码想要立即显示,只需要加上

  1. fflush(stdout)

基于以上这些,我们可以写一个小程序
在这里插入图片描述
这就实现了一个倒计时功能。
利用上面的思想,我们就可以开始写进度条了。

  1. #include<stdio.h>#include<unistd.h>#include<string.h>intmain(){int i =0;char bar[101];memset(bar,'\0',sizeof(bar)/sizeof(bar[0]));constchar*lable ="|/-\\";while(i <=100){
  2. bar[i]='\0';printf("%s %d%% %c\r",bar,i,lable[i%4]);fflush(stdout);
  3. bar[i]='#';
  4. i++;usleep(50000);//单位是微秒 }printf("\n");return0;}

这样一个简易的进度条就完成了。
但这样写出来的进度条确实简易,大家可以自行对代码进行完善。
这是博主添加配色后的代码。

  1. #include<stdio.h>#include<unistd.h>#include<string.h>intmain(){int i =0;char bar[101];memset(bar,'\0',sizeof(bar)/sizeof(bar[0]));constchar*lable ="|/-\\";while(i <=100){printf("\033[1;32;44m%s\033[0m [%d%%][%c]\r",bar,i,lable[i%4]);fflush(stdout);
  2. bar[i]=' ';
  3. i++;usleep(50000);//单位是微秒 }printf("\n");return0;}

在这里插入图片描述
printf()的配色方案大家可以在网上搜一下,根据需要自行配色。

标签: linux vim centos

本文转载自: https://blog.csdn.net/qq_52363432/article/details/123037123
版权归原作者 你帅你先说. 所有, 如有侵权,请联系我们删除。

“[Linux]常见环境开发工具”的评论:

还没有评论