• 【Linux】Linux环境基础开发工具使用—— vim | gcc & g++ | make & makefile | 进度条 | git


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


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

    请添加图片描述

    请添加图片描述

    🌍一.Linux 软件包管理器 yum

    🌈1.什么是软件包

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

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

    在这里插入图片描述

    🌈2.软件安装三板斧

    💦查看软件包

    🥑默认列出所有软件

    sudo yum list
    
    • 1

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

    我们以sl小火车为例子:

    sudo yum list | grep sl  
    
    • 1

    在这里插入图片描述

    💦如何安装软件

    🥑安装软件

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

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

    sudo yum install -y 安装软件
    
    • 1

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

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

    安装扩展源

    sudo yum install -y -epel-release
    
    • 1

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

    sudo yum install cowsay.noarch
    
    • 1

    在这里插入图片描述

    💦如何卸载软件

    🥑 卸载软件

    sudo yum remove sl  //以火车为例
    
    • 1

    同样可以加-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] →右移一格
    
    • 1
    • 2
    • 3
    • 4

    🥑光标位置锚点

    快速定位到结束行【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]	快速切换双屏的光标
    
    • 1
    • 2

    在这里插入图片描述

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

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

    set nu		调出行号
    set nonu	取消行号
    
    • 1
    • 2

    退出——

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

    💦不退出vim执行命令(执行命令行、编译,查看,运行,查看man):!cmd

    在这里插入图片描述

    执行完 回车即可回到vim

    🌈4. 简单vim配置

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

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

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

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

    那如何添加sudo信任关系?

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

    vim /etc/sudoers
    
    • 1

    在这里插入图片描述
    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
    
    • 1

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

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

    在这里插入图片描述

    在这里插入图片描述

    可见预处理后还是c语言

    💦 2.编译

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

    gcc -S hello.i -o hello.s
    
    • 1

    在这里插入图片描述

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

    💦 3.汇编

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

    gcc -c hello.s -o hello.o
    
    • 1

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

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

    在这里插入图片描述

    💦 4.链接

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

    gcc hello.o -o hello 
    
    • 1

    在这里插入图片描述

    🌈 动态库vs静态库

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

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


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

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

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

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

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

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

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

    gcc hello.c -o hello_static -static
    
    • 1

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

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

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

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

    在这里插入图片描述

    🌍四.Linux调试器-gdb使用

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

    🌈 4.1 release & debug模式

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

    在这里插入图片描述

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

    gcc -o mytest mytest.c -g
    
    • 1

    在这里插入图片描述

    🌈 4.2 gdb指令集

    为了演示各种指令

    在这里插入图片描述

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

    l/list 	显示源代码
    
    • 1

    在这里插入图片描述

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

    🥑断点:breakpoint

    b 行号	  在某一行设置断点
    d(delete) n   删除序号为n的断点(注:删除时不以行号标定)
    info b 	   查看断点信息
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    disable n 	禁用断点
    enable n  	启用断点
    
    • 1
    • 2

    在这里插入图片描述

    相当于vs下的——

    在这里插入图片描述

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

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

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

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

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

    🥑监视

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

    在这里插入图片描述

    quit 退出
    
    • 1

    🌍五. make & makefile

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

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

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

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

    touch makefile
    
    • 1

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

    🔥也可以这样写——

    在这里插入图片描述

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

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

    在这里插入图片描述

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

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

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

    🥑生成项目&清理项目

    make 		生成解决方案
    make clean 	清理解决方案
    
    • 1
    • 2

    在这里插入图片描述

    相当于vs下——

    在这里插入图片描述

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

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

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

    .PHONY:clean
    clean:
     	rm -f mytest
     	
    mytest:test.c
    	gcc test.c -o mytest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

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

    在这里插入图片描述

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

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

    首先我们得知道两个概念:

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

    🌈行缓冲区

    // 1.
    #include 
    
    int main()
    {
         printf("hello Makefile!\n");
         sleep(3);
         return 0;
    }
    
    // 2. 发现sleep的过程中,并没有打印。
    #include 
    #include 
    
    int main()
    {
         printf("hello Makefile!");
         sleep(3);
         return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

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

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

    fflush(stdout);
    
    • 1

    🌈进度条

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

    #include
    #include
    #include
    
    #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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    • 进度条[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就是刚刚复制的仓库链接
    
    • 1

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

    🌈git add

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

    git add [文件名]
    
    • 1

    在这里插入图片描述

    🌈git commit

    🔥提交改动到本地

    git commit -m "日志信息"
    
    • 1

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

    在这里插入图片描述

    🌈git push

    🔥同步到远端服务器上

    git push
    
    • 1

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

    📢写在最后

    • 能看到这里的都是棒棒哒🙌!
    • 想必权限也算是Linux中重要🔥的部分了,如果认真看完以上部分,肯定有所收获。
    • 接下来我还会继续写关于📚《gdb》等…
    • 💯如有错误可以尽管指出💯
    • 🥇想学吗?我教你啊🥇
    • 🎉🎉觉得博主写的还不错的可以一键三连撒🎉🎉
      请添加图片描述
  • 相关阅读:
    博客系统(页面)
    C++制作游戏引擎之一 方向键控制地球上下左右乱跑
    优秀代码赏读之第一篇
    LabVIEW什么时候需要使用DLL封装 Calling External APIs
    如何使用 React 和 Docusaurus 编写的一些自定义钩子(Hook)
    Linux网络-DNS域名解析服务
    Java面试——中间件
    (二)正点原子STM32MP135移植——TF-A移植
    【Datawhale课程笔记-简单学点大模型】引言
    RocketMQ高性能核心原理与源码架构剖析
  • 原文地址:https://blog.csdn.net/qq_42996461/article/details/126349568