当前位置: 首页 > article >正文

【Linux】--- 开发工具篇:yum、vim、gcc、g++、gdb、make、makefile

Linux 开发工具篇

  • 一、yum
    • yum的使用:
    • (1)安装软件:
    • (2)卸载软件:
  • 二、vim
    • 1、vim的概念
      • (1)命令模式:
      • (2)插入模式:
      • (3)底行模式:
    • 2、vim不同模式之间的切换
      • (1)命令模式切换成插入模式:
      • (2)命令模式切换成底行模式:
      • (3)插入模式和底行模式切换为命令模式
    • 3、命令模式操作
      • (1)移动
      • (2)剪切
    • 4、底行模式操作
      • (1)列出行号:
      • (2)跳到某行:
      • (3)保存文件:
      • (4)退出vim :
  • 三、Linux编译器-gcc/g++
    • 1、gcc/g++作用
    • 2、gcc/g++编译过程
      • (1)预处理--选项-E 生成 .i
      • (2)编译-选项-S 生成.s
      • (3)汇编-选项-c 生成.o
      • (4)链接-选项-o 生成可执行程序
  • 四、gdb调试
    • 1、gdb简介
    • 2、gdb调试
      • (1)r运行程序
      • (2)start启动程序
      • (3)l列出代码
      • (4)b设置断点
      • (5)disable禁用断点
      • (6)delete删除断点
      • (7)s逐语句执行(step)
      • (8)n逐过程执行
      • (9)until跳至某行
  • 五、make/Makefile
    • 1、了解make/Makefile
      • (1)make
      • (2)Makefile
    • 2、如何写一个Makefile

一、yum

yum是Linux中常用的软件安装的方法

yum就相当于手机上的:“应用商店”、“App Store”可以从对应的远端服务器上直接拿取已经下载好的资源包,进行安装!
在这里插入图片描述
同样,yum也是安装在linux上的一个客户端,在服务器上找到找到yum对应的服务,并且把软件信息下载下来,而且会根据该软件对应的依赖关系把相关软件下载下来并安装好。

yum的使用:

(1)安装软件:

安装软件必须以root权限进行软件安装,命令:

sudo yum install  软件名

(2)卸载软件:

同样卸载软件也要在root权限下执行卸载软件命令:

sudo  yum remove 软件名 

二、vim

1、vim的概念

vim是从vi发展出来的文本编辑器,不过vim是vi的升级版本,它不仅兼容vi的所有指令,还有新特性,比如语法加亮,可视化操作,不仅可以在终端运行,也可以在x window、 mac os、windows上运行。

在vim状态下,有三种模式:

(1)命令模式:

控制屏幕光标的移动,字符、字或行的删除,可以移动、复制、剪切、粘贴文本。

(2)插入模式:

只有在插入模式下才可以输入文字,编辑时使用较频繁。

(3)底行模式:

保存文件、退出文件、替换文件,找字符串,列出行号等操作。可使用vim help-modes查看当前vim的所有模式。

2、vim不同模式之间的切换

各种不同模式之间的切换:

在这里插入图片描述

(1)命令模式切换成插入模式:

命令模式切换成插入模式有i、a、o 三种:

i:从光标当前位置开始输入文件

a:从光标所在位置的下一个位置开始输入文字
o:插入新的一行,从行首开始输入文字

(2)命令模式切换成底行模式:

:

(3)插入模式和底行模式切换为命令模式

Esc

3、命令模式操作

(1)移动

移动光标有以下多种常用操作:

「h」:左
「l」:右
「k」:上
「j」:下
「^」:移动到光标所在行的“行首”
「$」:移动到光标所在行的“行尾”
「w」:光标跳到下个字的开头
「e」:光标跳到下个字的字尾
「b」:光标回到上个字的开头
「nl」:光标移到该行的第n个位置,如:5l,56l
[gg]:跳到第一行行首
「G」:跳到最后一行行首
[shift+g]:进入文本末端

(2)剪切

剪切文本有以下几种常用操作:

dd:剪切光标所在行
ndd:剪切从光标所在行开始往下的n行
p:将剪切的字符粘贴到下一行
np:将剪切的字符粘贴到下n行

4、底行模式操作

在按「Esc」后,按「:」进入底行模式,才能做以下操作:

(1)列出行号:

「set nu」:列出所有行行号
「set nonu」:隐藏所有行行号

(2)跳到某行:

「n」:n代表第n行,输入n,再按「enter」就跳转到第n行了

(3)保存文件:

「w」:在冒号后面输入w

(4)退出vim :

「q」:退出
「q!」:强制退出vim
「wq」:保存后退出vim
「wq!」:保存后强制退出vim

三、Linux编译器-gcc/g++

1、gcc/g++作用

gcc和g++是由GNU开发的编程语言编译器,其中,gcc用来编译c程序,g++用来编译c++程序。编译程序时,都要经历以下4个阶段:

  • 预处理(包含头文件、宏替换、删除注释、条件编译,生成.i)
  • 编译(语法分析、词法分析、语义分析、符号汇总,生成.s
  • 汇编(把汇编代码转换成机器指令(二进制指令),生成目标文件,形成符号表,生成.o)
  • 链接(合并段表,合并和重定位符号表,生成可执行程序)

2、gcc/g++编译过程

使用以下命令进行编译:

gcc 【选项]】 源文件 【选项】 目标文件

常用选项:

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S  编译到汇编语言不进行汇编和链接
-c  编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w  不生成任何警告信息。
-Wall 生成所有警告信息。

(1)预处理–选项-E 生成 .i

  • 预处理功能主要包括宏定义,文件包含,条件编译,删除注释等。 预处理指令是以#号开头的代码行。
  • 选项“-E”,让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”,是指目标文件,“.i”文件为已经过预处理的C原始程序。

对于文件HelloWorld.c

#include<stdio.h>
#define NUMBER 2
 
int main()
{
#if NUMBER
        printf("NUMBER=%d\n",NUMBER);//NUMBER被定义,就打印NUMBER的值,否则打印error
#else
        printf("error");
#endif
        return 0;
 
}
 

执行这个命令:

gcc -o HelloWorld.c -o HelloWorld.i

这就生成了HelloWorld.i文件,cat一下HelloWorld.i文件:

在这里插入图片描述

(2)编译-选项-S 生成.s

  • 这个过程把c代码转成汇编,包括:语法分析、词法分析、语义分析、符号汇总
  • gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言
  • 可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
  • 选项“-o”,是指目标文件,“.s”文件为已经翻译过的C原始程序。

继续执行以下命令:

gcc -S HelloWorld.i -o HelloWorld.s

生成HelloWorld.s文件后,cat一下汇编代码HelloWorld.s:

在这里插入图片描述

(3)汇编-选项-c 生成.o

  • 把汇编代码转换成机器指令(二进制指令),生成目标文件,形成符号表
  • 汇编阶段把编译阶段生成的“.s”文件转成目标文件
  • 使用选项“-c”可看到汇编代码已转化为“.o”的二进制目标代码

使用以下命令:

gcc -c HelloWorld.s -o HelloWorld.o

在这里插入图片描述

(4)链接-选项-o 生成可执行程序

  • 合并段表,合并并重定位符号表。
  • 在成功编译之后,就进入了链接阶段

执行以下命令:

gcc HelloWrld.o -o HelloWorld

在这里插入图片描述

四、gdb调试

1、gdb简介

gdb是GNU开源组织发布的一个强大的UNIX下的程序调试工具,是命令行调试工具。一般来说,gdb主要完成如下四个功能:

(1)启动程序,按照自定义要求随心所欲运行程序。
(2)可让被调试的程序在指定的调试的断点处停住。(断点可以是条件表达式)
(3)当程序被停住时,可以检查此时程序中所发生的事。
(4)动态的改变程序的执行环境

程序的发布方式有两种,debug模式和release模式 ,Linux gcc/g++编译出来的二进制程序,默认是release模式 ,要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项:

gcc 源文件 -o 目标文件 -g

2、gdb调试

以插入排序的代码InsertSort.c为例:

#include<stdio.h>
#include <stdlib.h>
 
//打印
void Print(int* a, int n)
{
        for (int i = 0; i < n; i++)
        {
                printf("%d ", a[i]);
        }
 
        printf("\n");
}
 
//直接插入排序
void InsertSort(int* a, int n)
{
        //多趟排序
        for (int i = 0; i < n - 1; i++)
        {
                //把temp插入到数组的[0,end]有序区间中
                int end = i;
                int temp = a[end + 1];
                while (end >= 0)
                {
                        if (temp < a[end])
                        {
                                a[end + 1] = a[end];
                                end--;
                        }
                        else
                        {
                                break;
                        }
                }
 
                a[end + 1] = temp;
 
        }
 
}
 
void TestInsertSort()
{
        int arr[] = { 9,1,2,5,7,4,8,6,3,5 };
        InsertSort(arr, sizeof(arr) / sizeof(arr[0]));
        Print(arr, sizeof(arr)/sizeof(arr[0]));
}
 
int main()
{
        TestInsertSort();
 
        return 0;
}

来了解gdb调试。

(1)r运行程序

r/run:运行程序

运行程序之前,要先以debug模式生成可执行程序,再进入debug模式,然后运行程序
在这里插入图片描述
默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处。

(2)start启动程序

start 指令会执行程序至 main函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。

在这里插入图片描述

(3)l列出代码

从第n行开始列出10行代码:

l/list n

从第1行开始,列出10行代码:
在这里插入图片描述
继续输入l,会跟着上面的代码继续显示,如下面显示11-20行,21-20行:

在这里插入图片描述

(4)b设置断点

在第n行打断点:

b n

在第23行打断点:

在这里插入图片描述

这步操作相当于VS的F9。

输入r运行,就会在23行停下来:

在这里插入图片描述

这就相当于VS的F5。

如果给函数名打断点,其实是给函数内容的第一行打了断点:

在这里插入图片描述

(5)disable禁用断点

使用disable可以禁用断点,使用如下命令禁用断点:

disable 断点编号

如下,禁用编号为2的断点,发现断电仅仅是被禁用而已,但是断点还在:
在这里插入图片描述

(6)delete删除断点

如果不想要某个断点了,可以使用delete删除断点:

删除某一断点:

delete 编号

删除所有断点:

delete

在这里插入图片描述

(7)s逐语句执行(step)

单步执行代码:

s/step

执行main函数代码,执行完45行,再执行46行,再进入InsertSort函数内部执行,如果遇到断点则会停下:

在这里插入图片描述
相当于VS的F11。

(8)n逐过程执行

逐过程执行:

n/next

在这里插入图片描述

假如将23行设置为断点,那么执行到断点处会停下:

在这里插入图片描述

相当于VS的F10。

(9)until跳至某行

在一个函数内直接执行到第n行:

until n

从第45行直接执行到第47行:
在这里插入图片描述

五、make/Makefile

1、了解make/Makefile

(1)make

make是一个解释makefile中指令的命令工具一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中。

(2)Makefile

Makefile是Linux项目自动化构建工具,Makefile规定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。编译的安排就叫做构建。构建规则都写在Makefile文件里面,要学会如何Make命令,就必须学会如何编写Makefile文件。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率,makefile成为了一种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两者搭配使用,形成可执行程序,完成项目自动化构建。

2、如何写一个Makefile

与源文件同级,创建一个Makefile文件:
在这里插入图片描述

将编译InsertSort.c的命令写入Makefile中。其中,第一行叫做依赖关系,第二行叫做依赖方法:

InsertSort:InsertSort.c       #依赖关系
        gcc InsertSort.c -o InsertSort -std=c99     #依赖方法

第一行开始的InsertSort叫做目标,InsertSort.c叫做前置条件,gcc InsertSort.c -o InsertSort -std=c99是命令,命令前有Tab键:

在这里插入图片描述

执行make命令后,会自动执行Makefile文件中的命令:

在这里插入图片描述
但是此时想再make一下,会发现不让make了:
在这里插入图片描述
因为可执行文件已经是最新了。Makefile默认的目标是文件,如果目标不是真实存在的文件,而是一个命令呢,那么这个目标就是伪目标,伪目标没有依赖关系,只有依赖方法,如下clean就是一个伪目标,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令:

InsertSort:InsertSort.c
        gcc InsertSort.c -o InsertSort -std=c99
.PHONY:clean      #伪目标
clean:
        rm -f InsertSort

其中:

在这里插入图片描述

由于make扫描Makefile文件时,默认只会形成一个目标依赖关系,一般是第一个,因此,现在执行make,并不能达到删除InsertSort可执行文件的目的,因为make会生成第一个目标也就是生成InsertSort可执行程序:
在这里插入图片描述
此时要执行非第一个目标时,需要make加上目标:

在这里插入图片描述
当把两个目标的顺序交换一下,会发现,执行make时就先执行clean命令:
在这里插入图片描述
这下直接make时,就不是编译生成可执行文件了, 而是执行clean命令,如果要生成可执行程序,必须执行make 加上目标:

在这里插入图片描述
也可以用 @ 表示目标文件, @表示目标文件, @表示目标文件,^表示上一行的冒号后面的依赖文件列表:
在这里插入图片描述


http://www.kler.cn/a/378056.html

相关文章:

  • kubernetes存储架构之PV controller源码解读
  • 深入探索仓颉编程语言:函数与结构类型的终极指南
  • git设置项目远程仓库指向github的一个仓库
  • 攻防世界web第三题file_include
  • THREE.js 入门(六) 纹理、uv坐标
  • 学习threejs,THREE.RingGeometry 二维平面圆环几何体
  • 萤石私有化设备视频平台EasyCVR视频融合平台如何构建农业综合监控监管系统?
  • 面试题整理 4
  • 阿里云docker安装禅道记录
  • TCP三次握手,四次挥手,以及11种状态详解
  • Oracle 第17章:数据字典与视图
  • python的数据结构列表方法及扩展(栈和队列)
  • InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记
  • IDEA 好用的插件分享
  • Blender进阶:贴图与UV
  • 【C++篇】跨越有限与无限的边界:STL之set容器中的自我秩序与无限可能
  • 【踩坑】修复高版本dgl中distributed.load_partition不返回orig_id问题
  • nodejs入门教程19:nodejs dns模块
  • 第三百零五节 Log4j教程 - Log4j日志记录方法
  • Excel常用函数与操作
  • ArcGIS软件之“新建中学最适合地址”地图制作
  • 十款思维导图软件推荐,有适合你的一款!!!
  • JavaScript的第十二天
  • 使用PostgreSQL进行高效数据管理
  • python爬虫获取数据后的数据提取
  • 面试题:JVM(二)