【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

🌈欢迎来到Linux专栏~~Linux环境基础开发工具使用


  • (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort🎓
  • 🌍博客主页张小姐的猫~江湖背景🌍
  • 快上车🚘握好方向盘跟我有一起打天下嘞
  • 送给自己的一句鸡汤🤔
  • 🔥集中起来的意志可以击穿顽石🔥
  • 🙏作者水平很有限如果发现错误可在评论区指正感谢🙏
  • 🎉🎉欢迎持续关注🎉🎉
    在这里插入图片描述

请添加图片描述

Linux环境基础开发工具使用

请添加图片描述

🌍一.Linux 软件包管理器 yum

🌈1.什么是软件包

我们在Linux上安装软件是怎么样安装的呢

  • ⚡yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器手机应用市场. 相当于Linux下进行软件安装的客户端。
  • yum也有依赖关系

在这里插入图片描述

🌈2.软件安装三板斧

💦查看软件包

🥑默认列出所有软件

sudo yum list

由于包的数目可能非常之多, 这里我们需要使用 行过滤工具grep 管道只筛选出我们关注的包.

我们以sl小火车为例子

sudo yum list | grep sl  

在这里插入图片描述

💦如何安装软件

🥑安装软件

sudo yum install sl.x86_64   以sl小火车为例

安装中会询问这个软件多大是否安装
在这里插入图片描述
这时候敲 “y” 确认安装.出现 “complete” 字样, 说明安装完成

sudo yum install -y 安装软件

-y不用询问我默认许可了

  • 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成但是不建议以root身份安装建议使用普通用户本文后面有讲如何sudo提高权限
  • yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错
  • centOS安装软件对应的服务器一般都在国外可能需要更新yum源
  • 还有不懂的就百度吧

安装扩展源

sudo yum install -y -epel-release

可以去找找什么软件好玩的

sudo yum install cowsay.noarch

在这里插入图片描述

💦如何卸载软件

🥑 卸载软件

sudo yum remove sl  //以火车为例

同样可以加-y跳过询问

🌍二.vim的使用

  • IDE 集成开发环境集成了编写编译调试链接运行于一体的开发环境

那我们是怎么样在linux下进行开发的呢使用gcc、g++、vim、等一个个的独立工具进行

🌈1.vim的基本概念

vim是一个文本编辑器和记事本没有区别只负责写代码

vim是一款多模式的编辑器有三种常见模式命令模式、插入模式底行模式。

在这里插入图片描述

  • 可见底行模式和插入模式不能直接切换都需要经过命令模式所以命令模式就是核心我们无脑的esc可退回
  • 命令模式(Normal mode)

控制屏幕光标的移动字符、字或行的删除移动复制某区段及按i进入插入模式下或者按shift+ 进入底行模式

  • 插入模式(Insert mode)

只有在Insert mode下才可以做文字输入按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

  • 底行模式(last line mode)

文件保存或退出也可以进行文件替换找字符串列出行号等操作。 在命令模式下shift+: 即可进入该模式。

🌈2. vim命令模式指令集

💦光标移动

vim可以直接用键盘上的上下左右来移动但是我们不建议后面接触到的命令必须用到hjkl

我们看看最早的老式键盘

在这里插入图片描述

[h] ←左移一格 
[j]  ↓下移一格jump向下跳
[k]  ↑上移一格king王子高高在上
[L] →右移一格

🥑光标位置锚点

快速定位到结束行【shift + g】
快速定位到起始行gg
定位到行首【shift + $】
定位到行尾【shift + ^】

💥快速定位到某一行

快速定位到某一行【n + shift + g】

🔥行内进行跳转 —— 以单词为单位进行光标左右移动

光标跳到下一个字的开头w
光标跳到上一个字的开头b

💦文本操作

🥑复制粘贴

复制当前行yy
n行复制复制当前及其后共n行nyy
粘贴p
一次性粘贴n次np

💥撤销恢复

撤销误操作u
恢复撤销最近的撤销[ctrl + r]

💥 删除剪切

从左向右删删除光标所在位置处的一个字符x
支持nxnx
从右向左删删除光标前一个位置处的一个字符[X]shift + x
支持nXnx
  • 删除行
删除光标所在行dd
删除多行ndd
相当于剪切dd→p

局部的修改

快速的大小写切换【shift + ~
替换模式【shift + r
替换光标所在处的一个字符r + 字符
支持nrnr + 字符

常见 vim中字符串儿替换:%s/ / /g

无脑esc退出

🌈3. vim底行模式指令集

双屏操作

vs 文件名   //分屏
[ctrl + ww]	快速切换双屏的光标

在这里插入图片描述

注意现在光标在哪个屏幕代表底行就是哪个

💦在命令模式里【shift + :】进入底行模式

set nu		调出行号
set nonu	取消行号

退出——

q	退出
wq	保存并退出
!	强制写入、退出[q!][w!][wq!]

💦不退出vim执行命令执行命令行、编译查看运行查看mancmd

在这里插入图片描述

执行完 回车即可回到vim

🌈4. 简单vim配置

🔥注意:不管是root还是普通用户配置只会影响自己

  • 用户和root都分别有自己的配置文件

云服务器上不含这个配置文件如果没有就自己创建一个所有的配置都写入在这个普通文件中
在这里插入图片描述

之前我们一直都执行不了sudo,是因为没有信任

那如何添加sudo信任关系?

首先切换成root身份进入家目录

vim /etc/sudoers

在这里插入图片描述
wq! 强制退出即可

🌍三.Linux编译器 ~ gcc/g++使用

gcc是C语言的编译器g++是Cpp的编译器兼容c

源代码生成可执行文件经历了编译+链接其中编译又分为三个阶段

  1. 预处理宏替换、头文件展开、条件编译、去注释
  2. 编译C ➡️ 汇编
  3. 汇编汇编 ➡️ 可重定向二进制目标文件
  4. 链接链接 ➡️ 多个.o (Linux) / .obj (windows)文件合并形成一个可执行程序

那么gcc / g++要不要遵循这样的规则呢

🌈 翻译过程及选项

  • 翻译阶段ESc是不是很熟悉呢就是我们键盘最左上角的那个 🔥区分大小写哦
  • 对应阶段生成文件的后缀名 - iso是镜像文件后缀名之一。

💦 1.预处理

gcc -E mytest.c -o hello.i

-ooutput自己指定形成的文件如果不指定会把结果全部打印到屏幕上。

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

在这里插入图片描述

在这里插入图片描述

可见预处理后还是c语言

💦 2.编译

-S现在开始程序翻译如果编译完成就停下

gcc -S hello.i -o hello.s

在这里插入图片描述

在这里插入图片描述
计算机也看不懂汇编语言还得再翻译

💦 3.汇编

🥑现在开始进行翻译完成汇编后停下来

gcc -c hello.s -o hello.o

.o文件代表重定位目标文件 其人话经过汇编后变成了二进制

ps当前的二进制文件是没法执行的
在这里插入图片描述

在这里插入图片描述

💦 4.链接

🥑目标文件和链接库经过链接生成可执行程序

gcc hello.o -o hello 

在这里插入图片描述

🌈 动态库vs静态库

我们可以通过file命令来查看gcc默认采用动态链接的方式形成可执行文件
在这里插入图片描述

可以通过ldd命令来查看可执行程序依赖的库
在这里插入图片描述


链接会把自己写的C程序和语言或者第三方库提供的方法关联起来

💥函数库在Linux下静态库.o动态库.so两种windows下静态库.lib动态库为.dll

  • 静态链接时需要.a静态库。静态链接是把库文件的有关代码拷贝到我的可执行文件中因此生成的文件比较大但在运行时也就不再需要任何库文件了可移植性较好
  • 动态链接时需要.so动态库。静态链接并不会把库文件的代码加入到可执行文件中而是在程序执行时由运行时链接文件加载库地址这样可以节省内存和硬盘的空间

ps它们没有绝对的好坏只有谁更合适

C程序是脱离不开C库文件的

理论讲完开始实操 动手动手
在这里插入图片描述

若要采用静态链接需要带选项

gcc hello.c -o hello_static -static

-static表面使用静态链接的方式形成可执行程序

ps有些机器可能会没有静态库导致连接失败 需要下载静态库libc.a

安装C静态库 & C++静态库指令如下

sudo yum install glibc-static   //c静态库
sudo yum install libstdc++-static  //c++静态库

在这里插入图片描述

🌍四.Linux调试器-gdb使用

对于gdb的使用我们的要求是熟悉使用常用指令即可

🌈 4.1 release & debug模式

我们知道程序的发布方式有两种debug模式和release模式
Linux gcc/g++出来的二进制程序默认是release模式无法调试的。如果一个二进制的文件可以被调试一定加入了一些调试信息。

在这里插入图片描述

想要调试必须在gcc/g++编译时候加上-g选项

gcc -o mytest mytest.c -g

在这里插入图片描述

🌈 4.2 gdb指令集

为了演示各种指令

在这里插入图片描述

🥑显示代码要打断点要先知道行号

l/list 	显示源代码

在这里插入图片描述

gdb会记录最近一条命令如果命令无变化可以直接回车

🥑断点breakpoint

b 行号	  在某一行设置断点
ddelete n   删除序号为n的断点注删除时不以行号标定
info b 	   查看断点信息

在这里插入图片描述

disable n 	禁用断点
enable n  	启用断点

在这里插入图片描述

相当于vs下的——

在这里插入图片描述

r/run	运行程序 - 相当于F5
———————————记得打断点——————————
n/next	逐过程 - 相当于F10
s/step	逐语句 - 相当于F11

在这里插入图片描述
调试前要先run起来

🥑快速确定代码中是哪一行出错了

finish 		结束当前函数
c/continue 	直接到下一个断点
until 行号   跳转到指定行     不建议

在这里插入图片描述
在这里插入图片描述

🥑监视

display 变量名	 	常显示
p/P 变量名 	 	打印一次
undisplay 数字 	取消对变量的常显示  	
bt 查看当前的调用堆栈

在这里插入图片描述

quit 退出

🌍五. make & makefile

一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作。makefile带来的好处就是——“自动化编译”一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率

  • make是一条命令makefile是一个文件
  • 编写makefile包含依赖关系&依赖方法两者搭配可以达到形成可执行程序的目的

🥑理解爸我是你儿子使用你给我发生活费

🔥 touch一个Makefile来表明依赖关系和依赖方法

touch makefile

在这里插入图片描述.PHONY:修饰对应符号让符号变成伪目标伪目标总是被执行的也确实观察到如果没有对文件进行修改执行make命令是没有效果的(底层是通过对比修改时间和可执行时间实现的)然而make clean 即便刚刚执行过也可以随便执行。

🔥也可以这样写——

在这里插入图片描述

  • $@目标文件
  • $^文件列表

🎶总是被执行的总是会根据依赖关系执行依赖方法,我们习惯给clean设置.PHONY,可执行程序不带

在这里插入图片描述

makefile是如何得知我的可执行文件是最新的

根据文件最近的更改时间来判断比较源文件和生成文件时间

在这里插入图片描述ps当我们修改内容的时候有时候change时间也可能会变化

🥑生成项目&清理项目

make 		生成解决方案
make clean 	清理解决方案

在这里插入图片描述

相当于vs下——

在这里插入图片描述

ps❗有些时候我们代码编译不过就是忘记了保存所以写入磁盘的时间没有变系统认为你没有修改没有编译失败这时候就要清理一下解决方案重新生成

🥑make会根据你编写的依赖关系从上往下自动推导程序的执行

make会在当前目录下找名字叫Makefile或makefile的文件。然后它会默认找文件中的第一个目标文件target并把这个文件作为最终的目标文件。

.PHONY:clean
clean:
 	rm -f mytest
 	
mytest:test.c
	gcc test.c -o mytest

在这里插入图片描述

在如下代码中mytest所依赖的mytest.o不存在或是被修改就会执行对应的依赖方法依赖方法中mytest.o又不存在那么make会在Makefile文件中寻找目标为test.o文件的依赖关系如果找到则再根据其依赖方法生成test.o文件以此类推。类似于堆栈的过程。

在这里插入图片描述

总之make会一层又一层地去找文件的依赖关系直到最终编译出第一个目标文件。当然依赖后仍然找不到那就只能报错了

🌍 六.Linux第一个小程序-进度条

首先我们得知道两个概念

  • 回车\r回到当前行的最开始
  • 换行\n列不变新起一行
    在这里插入图片描述

🌈行缓冲区

// 1.
#include <stdio.h>

int main()
{
     printf("hello Makefile!\n");
     sleep(3);
     return 0;
}

// 2. 发现sleep的过程中并没有打印。
#include <stdio.h>
#include <unistd.h>

int main()
{
     printf("hello Makefile!");
     sleep(3);
     return 0;
}

这意味着sleep先于printf执行吗肯定不是❗

只是printf不带\n在向显示器打印时数据不会立即刷新而是会暂时保存在用户C语言级别的缓冲区中(c语言给我们提供的一块内存)显示器的刷新策略就是行刷新遇到\n即把之前的字符串全部显示出来。

🥑那如果我们即不想换行又想刷新咋办可以调用这个函数来刷新显示器

fflush(stdout);

🌈进度条

思路不换行从左至右变长走完再换行

#include<stdio.h>
#include<unistd.h>
#include<string.h>

#define NUM 102  
 
int main()
{
	char bar[NUM];
	memset(bar,0,sizeof(bar));
	const char *lable="|/-\\";//4
	int cut = 0;
	while(cut <= 100)
	{
		printf("[%-100s][%d%%] %c\r", bar, cut, lable[cut%4]);                                         
		fflush(stdout);
		usleep(200000);
		bar[cut++] = '#';
	}
    printf("\n");
    return 0;
}

🥑下面一一讲解一下小细节

  • 进度条[0 ~ 100]不换行且能刷新需要\r配合fflush库函数
  • sleep太慢了我们设置成休眠usleep单位是微秒
    在这里插入图片描述
  • 我们设置bar数组长度为102因为字符串结束的\0我们也算上然后用menset全部置为0

在这里插入图片描述

  • [%-100]来打印百分比然后预留100个字符的空间并且是从左向右打印
  • label旋转光标表示当前进度条处于工作状态注意\为特殊字符需要转义\\
  • 同样我们也给此进度条编写makefile一步到位make
    在这里插入图片描述
  • 可以在测试代码时候写之前就把makefile写好

请添加图片描述ps注意字体不能调节太小亲身尽力过代码代码没做结果是字体太大一行打不完自动换行了

🌍 七.git

🌈创建仓库和git clone

创建仓库这个不多说了
在这里插入图片描述
🥑创建本地的代码仓库

git clone [url]  url就是刚刚复制的仓库链接

在这里插入图片描述
接下来是简单的三板斧

🌈git add

🔥
将代码放到本地的目录中

git add [文件名]

在这里插入图片描述

🌈git commit

🔥提交改动到本地

git commit -m "日志信息"

日志信息必须写否则无法提交且不能乱写可以写修改了啥

在这里插入图片描述

🌈git push

🔥同步到远端服务器上

git push

在这里插入图片描述
在这里插入图片描述上传成功嘿嘿还得多练习啊

📢写在最后

  • 能看到这里的都是棒棒哒🙌
  • 想必权限也算是Linux中重要🔥的部分了如果认真看完以上部分肯定有所收获。
  • 接下来我还会继续写关于📚《gdb》等…
  • 💯如有错误可以尽管指出💯
  • 🥇想学吗我教你啊🥇
  • 🎉🎉觉得博主写的还不错的可以一键三连撒🎉🎉
    请添加图片描述
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux