• Linux开发工具的使用(vim、gcc/g++ 、make/makefile)


    一 :Linux编辑器–vim

    1:vim基本概念

    vim是Linux下的一个多模式的编译器 简单来说就是写代码的工具 不提供编译调试等功能
    有语法高亮功能 可视化操作不仅可以在终端运行 还可以运行与x windows mac os windows

    2:vim的常用三种模式

    在这里插入图片描述

    1、命令模式
    控制光标的移动 字符,字或行 的删除 ,移动复制某区段
    以及切换到插入模式和底行模式下
    2、插入模式(使用最频繁的模式)
    只有在插入模式下 才可以进行文字的输入
    以及切换到命令模式
    3、底行模式
    文件保存或退出 也可以进行 文件替换 找字符串 列出行号等
    以及切换到命令模式

    3:vim三种模式的相互转换

    在这里插入图片描述

    命令模式切换到插入模式
    输入a:进入插入模式后 从目标光标所在位置的下一个位置开始输入文字
    输入i: 进入插入模式后 从光标当前位置开始输入
    输入0:进入插入模式后 插入新的一行 从行首开始输入文字
    命令模式 切换到底行模式
    输入shift+;
    插入模式/底行模式切换命令模式
    按ESC即可
    插入模式和底行模式之间不能相互转换

    4:vim命令模式下的命令集

    - 移动光标

    • vim可以直接使用键盘来控制光标的上下左右移动,正规的vim使用的是小写字母h j k l 分别控制光标左下上右移动一格 也可以使用方向键进行移动
    • G :移动到文章的最后
    • gg:进入到文本开始
    • $(shift+4):移动到光标所在行的行尾
    • ^(shift+6):移动到光标所在行的行首
    • n+Enter:光标向下移动n行
    • n+l:光标进去到改行的第n个位置
    • ctrl+b :屏幕向前翻一页
    • ctrl+f:屏幕向后翻一页
    • ctrl+u:屏幕向前翻半页
    • ctrl+d:屏幕向后翻半页
    • w:光标进入到下个字的开头
    • e:光标进入到下个字的自尾
    • b:光标回到上个字的开头

    -删除文字

    • x:每按一次删除光标所在位置一个字符
    • n+x:删除光标所在位置后面的n个字符
    • X:删除光标所在位置前一个字符
    • n+X:删除光标所在位置后前面的n个字符

    -剪切/删除

    • dd:剪切/删除光标所在行
    • n+dd:从光标所在行开始剪切/删除n行
    • p:将剪切的内容复制到光标所在位置下一行
    • n+p:将剪切的内容复制到光标所在位置下一行开始复制n行

    -复制

    • yy:复制光标所在行到缓冲区
    • n+yy:复制从光标所在行往下数n行字符到缓冲区
    • p:将缓冲区的字符粘贴到光标所在位置下一行
    • yw:将光标所在位置到字尾的字符复制到缓冲区
    • n+yw:复制n个字到缓冲区

    -替换

    • r: 替换光标所在处的字符
    • R:替换光标所在位置的字符 直到按下esc停止uu
    • ctrl+~:快速切换大小写

    -撤销和恢复

    • u:撤销
    • ctrl+r:恢复

    -跳转至指定行

    • n+G:移动到第n行行首

    5:vim底行模式下的命令集

    在使用底行模式之前 先按ESC键确定自己处于命令模式 然后再按shift+;进入底行模式

    • 输入 set nu:按回车后在文件中的每一行前列出行号
    • 输入 set nonu:按回车后在文件中的取消列出的行号
    • 输入数字:按回车后就会跳转到该行行首
    • 输入w:保存文件
    • 输入w!:强制保存
    • 输入q:退出文件
    • 输入q!:强制退出文件
    • 输入wq:保存并退出文件
    • 输入vs+文件名:进行多文件操作
    • 输入ctrl+ww:光标在不同文件中切换
    • !+其他指令 :在不退出vim的情况下执行Linux其他命令

    二:Linux编译器–gcc/g++

    1:gcc/g++的作用

    gcc/g++分别是GUN中的c和c++编译器
    对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
    对于 .c和.cpp文件,g++则统一当做cpp文件编译

    在使用gcc之前 应该了解一个.c源文件到一个.exe可执行程序经历了哪些过程和函数库 # 程序编译链接的四个过程

    1. 预处理
      完成头文件的展开 删去注释 宏替换等工作
    2. 编译
      将源代码翻译成汇编语言 语法分析 词法分析 语义分析等
    3. 汇编
      汇编代码转换成为二进制指令产生目标文件
    4. 链接
      将汇编过程产生的二进制指令进行连接 生成可执行程序

    2:gcc/g++的语法

    gcc/g++ 选项 文件
    常用选项:
    -E :只进行预处理 不会生成文件 需要自己重定向到一个文件里
    -S: 编译到汇编语言(生成.s文件) 不进行汇编和链接
    -c:编译到目标文件 (生成.o文件) 不进行链接
    -o:将执行结果输出到指定文件中
    -static:对生成的文件采用静态链接

    3:预处理

    gcc -E -o test.i test.c
    将源文件test.c进行预处理后停止 将是执行结果输出到test.i文件中
    在这里插入图片描述
    可以看到预处理阶段完成了头文件的展开 删去注释 宏替换等工作

    4:编译

    gcc -S test.s
    将预处理阶段产生的test.i文件编译产生.s汇编文件
    在这里插入图片描述
    在这里插入图片描述

    5:汇编

    gcc -c test.s
    将汇编文件test.s编译成产生.o目标文件
    在这里插入图片描述
    在这里插入图片描述

    6:链接

    gcc test.o
    将目标文件链接产生可执行程序a.out
    在这里插入图片描述
    如果你也和我一样 不喜欢a.out 用-o进行重定向gcc -o test.exe test.o
    在这里插入图片描述
    可执行程序也是二进制指令
    在这里插入图片描述

    7:函数库

    我们在c程序中,并没有实现printf函数,且在预编译中包含的头文件stiod.h中也仅仅只是有该函数的声明 并没有定以实现该函数 那么printf函数在哪里实现的呢?
    在Linux中 系统把这些函数都实现在一个名为libc.so.6(Linux中的一个动态链接库 包含了标准c库的实现)的文件中 在没有特别指定时 gcc会到系统默认的路径’‘/usr/lib’'下进行查找,也就是链接到libc.so.6库函数中去 这样就能实现函数printf了 这也就是链接的作用
    库函数一般分为静态库和动态库

    - 动静态库

    • 静态库是指在编译链接时 把库文件的代码全部加入到可执行文件中 因此生成的可执行程序文件会比较大 但在运行时也就不需要库文件了在linux下后缀名一般为.a windows中后缀名为.lib
    • 动态库则是在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库 这样可以节省系统的开销 在Linux下后缀为.so windows后缀为.dll 前面所说的libc.so.6就是动态库
    • gcc在编译时默认使用动态链接(使用file命令验证)

    file 命令
    语法: file 文件名
    功能: 辨识文件类型
    在这里插入图片描述
    gcc/g++在编译时默认采用动态链接 我们也可以加上-static选项使用静态链接的方式编译
    gcc -o newtest.exe test.c -static
    在这里插入图片描述
    采用静态链接 可执行程序会比较大
    我们也可以查看一个可执行程序所依赖的库(使用ldd命令)

    ldd 命令
    语法: ldd 可执行程序
    功能: 查看一个可执行程序依赖的库

    在这里插入图片描述

    - 动态链接的优缺点

    在这里插入图片描述

    8:静态链接的优缺点

    在这里插入图片描述

    三:Linux项目自动化构建工具make/makefile

    • make/makefile 是Linux项目自动化构建的工具
    • make是一个命令工具 是一个解释makefile当中的指令的工具
    • makefile是一个文件 带来的好处就是自动化编译 makefile写的好 只需要一个make命令 就能完成整个工程的自动编译 极大提高了开发效率 一个比较大的工程源文件不计其数 按照其类型 功能 模块存放在若干个目录中 mkaefile定义了一系列的规则来指定哪些文件需要先编译 哪些文件需要后编译 甚至于进行更复杂的功能操作
    • make需要和makefile互相搭配使用 完成项目的自动化构建

    在使用make/makefile之前 先了解一下各个文件之间的依赖关系和依赖方法

    依赖关系

    在这里插入图片描述

    依赖方法

    在这里插入图片描述

    make工作原理

    • 当我们输入make命令时 make会在当前目录下寻找名为Makefile或者makefile的文件
    • 找到之后 他会找文件中的第一个“目标文件” 上面makefile例子中 他会找到test这个文件 将这个文件作为最终的"目标文件"
    • 如果test文件不存在 或者是test所依赖的后面test.o 文件的修改时间 要比这个test文件新 那么他就会执行后面所定义的命令来生成test这个文件
    • 如果test所依赖的test.o文件不存在 那么make会在当前文件中找目标位test.o文件的依赖 找到的话 在根据那一个规则生成test.o文件
    • 这就是整个make的依赖性 make会一层一层的去找文件的依赖关系 知道最终编译出第一个目标文件
    • 如果在查找过程中 被依赖的文件找不到 make就会直接退出 并报错 如果是定义的命令错误 或者是编译不成功 make根本不会理-
    • make只管文件的依赖性 如果找到了依赖关系后 冒号后面的文件还是不存在 这样的话make也不会工作

    在重新产生一个可执行程序时 都应该将之前生成可执行程序以及生成的文件进行清理 即项目是需要清理的

    项目清理

    make clean命令是用来清除所有的目标文件 以便重新编译 像清除这种没有被第一个目标文件直接或间接关联 那么他后面所定义的命令将不会被自动执行
    在这里插入图片描述
    一般这种clean的目标文件 直接将他设置位伪目标 .PHONY修饰,为目标的特性是可以强制执行
    在这里插入图片描述
    在这里插入图片描述

    四:Linux调试器–gdb

    背景:

    • 一个程序的发布方式有两中 分别是debug 和release模式
      debug一般是开发人员需要的环境 程序员需要调式找bug并解决bug
      release是经过优化后的版本 是用户使用的版本 不需要加入调试信息
    • Linux下 gcc/g++编译的二进制程序默认是release模式
    • 要使用gdb调试 必须是debug模式 在gcc/g++编译时 加上-g选项即可

    gdb的使用

    • gdb 可执行程序:进入调试
    • ctrl+d 或者 q:退出调试
      在这里插入图片描述
    • list/l 行号:显示指定行之后的源码 每次显示10行
    • list/l 函数名:显示函数的源码
      在这里插入图片描述
    • b 行号 :在指定行设置断点
    • b函数名:在指定函数开头设置断点

    在这里插入图片描述

    • info b :查看自己打的断点信息
      在这里插入图片描述
    • d breakpoints:删除所有断点
    • d 断点编号 :删除对应的断点
      在这里插入图片描述
    • disable 断点编号 :禁用断点
    • enable 断点编号:启用断点
      在这里插入图片描述
    • r(run) :运行程序
    • n(next):单条执行、逐过程执行 与vs中调试器的F10一样
    • s(step):进入函数调用 逐语句执行 与vs中调试器的F11一样
      在这里插入图片描述
      在这里插入图片描述
    • p (print) 变量名/&变量名 :显示变量的值或地址
    • display 变量名/&变量名:一直显示变量的内容或地址
    • undisplay 编号取消一直显示变量的内容或地址
      在这里插入图片描述
    • c(continue):从一个断点运行到下一个断点
    • finsh:将一个函数运行结束就停下来
    • until :直接运行到指定行
      在这里插入图片描述
      在这里插入图片描述
    • set var :修改一个变量的内容(不用修改源代码 进行多分支测试)
      在这里插入图片描述
  • 相关阅读:
    Kubernetes云原生实战03 搭建高可用负载均衡器(Keepalived 和 HAproxy)
    十五章:Java反射机制
    c++入门必学算法 并查集
    我的NAS方案及使用的功能
    pytest的内置插件盘点9. debugging
    24. 两两交换链表中的节点
    【ACWing 算法基础】KMP
    如何测试模型的推理速度
    go语言面试
    Git--原理与使用
  • 原文地址:https://blog.csdn.net/FBI_BAIGOU/article/details/134136114