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安装
我们在安装时可能会存在软件之间的依赖关系,安装非常麻烦,所以前两种方法我们通常不使用,而是使用第三种方法安装,

yum

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

应用商店


在Linux中输入

yum list

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

yum install xxx

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

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中,我们可以查看预处理的过程

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

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

gcc -S test.i -o test.s

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

gcc -c test.s -o test.o

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

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

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

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中,如果说

vim

是编译器,那么

gdb

就是调试器。

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版本。
添加调试信息

gcc test.c -o test -g

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

-std=c99

-g

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

b 行号

显示断点

info b

删除断点

d 行号

禁用断点

disable 行号

启用断点

enable 行号

逐过程调试

n

显示值

display 变量名

删除监视的变量

undisplay 编号

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

&sum

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

s

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

finish

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

continue

跳到某行

until 行号

查看调用堆栈

bt

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

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

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

Makefile

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

make clean

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

make

,而删除却要

make clean


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

rm -f test

的操作。

.PHONY:

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

make clean

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

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

代表

test

$^

代表

test.c

6.进度条

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

回车换行

,但你有想过

回车

换行

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

回到当前行的最开始。

换行指的是

列不变,新起一行。

我们来看段代码

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

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

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

fflush(stdout)

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

#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){                                                
       bar[i]='\0';printf("%s %d%% %c\r",bar,i,lable[i%4]);fflush(stdout);
       bar[i]='#';
       i++;usleep(50000);//单位是微秒                          }printf("\n");return0;}

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

#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);
           bar[i]=' ';
           i++;usleep(50000);//单位是微秒                          }printf("\n");return0;}

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

标签: linux vim centos

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

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

还没有评论