关于Linux下的常用软件工具

目录

前言:

vim

gcc/gcc-c++

make/makefile

gdb

写在最后


前言:

本篇主要介绍的是Linux下几种常用的软件的使用

关于Linux下软件的安装,yum源的配置请点击:


vim

vim,使用熟练后可以说是最厉害的文本编辑器(之一?)

vim的整体学习够一个新的篇章了,这里仅做简单介绍

vim的四种模式

  • normal普通模式
    任何模式下按Esc(多按几次都会回到普通模式)
    • 普通模式下进行各种命令操作和移动
      大部分情况下是浏览而不是编辑
  • insert插入(编辑)模式
    普通模式下键盘键入
    • i表示insert从当前位置编辑
    • I即insert before line表示从当前行首进行编辑
    • a表示append从当前光标后(追加)进行编辑
    • A即append after line表示从当前行末进行追加编辑
    • o表示open a line below往下新启一行开始编辑
    • O即append a line above表示往上一行新启一行开始编辑
  • :cmd 命令模式(普通模式下输入:即可)
    :set nu设置行号
    :vs(vertical split)竖分屏
    :sp(split)横分屏
    :!命令(不退出vim执行命令)
  • 可视化模式
    普通模式下按v(visual)即可进入
    • visual可视化模式一般用来块状选择文本(批量选则)
      • 进入后按V(大v)可选择行
      • ctrl + v可以进行块状选择(进入了visualblock模式)

vim的基础常用命令

  • :w保存文件但不退出vi
  • :w file将修改另外保存到file中,不退出vi
  • :w!强制保存,不推出vi
  • :wq保存文件并退出vi
  • :wq!强制保存文件,并退出vi
  • q:不保存文件,退出vi
  • :q!不保存文件,强制退出vi
  • :e!放弃所有修改,从上次保存文件开始再编辑

gcc/gcc-c++

这个工具即是Linux下常用的C语言/C++的编译器,只负责代码的编译

在Linux下使用该编译器可以采用分布处理,一步步编译

源程序--->可执行程序的过程被称作翻译(编译)
编译器翻译过程:-E,-S,-c (编译过程ESc ---> 对应的临时文件的后缀 .i .s .o)
text.i, text.s, text.o, a.out(可执行程序)

-o选项主要就是起到了“重定向”的作用,将输出内容输入到某个对应文件里

  • 1. 预处理(头文件展开、去除注释、进行宏替换、条件编译)
    gcc -E text.c -o text.i(-E选项即表示第一步做完后立即停下,生成的临时文件写入text.i中)
    如:#include<stdio.h>首先其一是将头文件的绝对路径展开;其二即是将头文件的相关内容拷贝到源文件中
  • 2.编译(生成汇编代码) 也可以从text.c进行,不过只是把第一步又做了一遍
    gcc -S text.i -o text.s
    (-S选项即表示第二步做完后立即停下,生成的临时文件写入到text.s中—)
  • 3. 汇编(生成机器可识别代码)汇编语言变成目标文件
    gcc -c text.s -o text.o
    (-c选项即表示第二步做完后立即停下,生成的临时文件写入到text.o中)
    .o文件(.obj文件)即目标文件--->二进制文件(不可执行文件)这仅仅是将我自身写的代码生成了二进制文件,不包括我们调用的第三方接口(标准库)如printf等函数
  • 4. 链接(生成可执行文件或库文件)
    本质是引用我们在代码中使用的第三方库(如C语言的c库)
    • gcc text.o -o mybin
      该语句即表示将text.o文件链接生成可执行程序并命名为mybin;其实也可以不带-o mybin 那其默认生成的即a.out文件
      ​(这里一样可以用text.c运行,不过会把前面三步又再做一遍)
    • 其默认链接c库,通过文件后缀来识别链接什么第三方库
  • ps:多文件的情况下,最好是先将每一个.c文件统一编译成.o文件,然后再链接生成可执行程序

gcc/g++在编译程序时,默认采用的是动态联编的方式,生成release版本的可执行程序

  • 采用静态库编译需增加 -static选项
    • Linux下,.so结尾的文件被称作动态库;.a结尾的文件即是静态库
      (分别对应Windows下dll与lib文件,库文件中是方法的实现,头文件中是方法的声明)
    • 动态链接:在程序运行时需要跳转到库中执行代码,在编译时,将库中的方法的地址拷贝到了程序中,资源占用较小,但是需要依赖库执行程序
    • 静态链接:在程序运行时无需跳转到库中执行代码,在编译时,将库中的方法实现也拷贝到了程序中,资源占用大,但是不依赖库文件
    • sudo yum install -y libstdc++-static(安装c++静态库)
      sudo yum install -y glibc-static(安装c静态库)
  • 生成包含debug信息需增加 -g选项

make/makefile

make是一条命令 --- makefile是一个文件
make是一个命令工具,是一个解释makefile中指令的命令工具

makefile可以理解成脚本,其默认是从上往下执行,默认只会形成一个可执行程序,即第一个扫描到的可执行程序,若要跳过第一个可执行程序,则需要带上其可执行程序名字

makefile带来的好处 --- > “自动化编译”,只需要一个make命令,整个工程完全自动编译

makefile第一行写依赖关系(要顶行),第二行写依赖方法(以tab开头)

ps:顶行和tab键开头是属于语法硬性要求,不可改变(即使是四个空格也不行)

mybin:main.c text.c  #表明依赖关系

        @gcc main.c text.c -o mybin   #实现依赖关系的方法

(加@符号则表示该命令执行但不回显,不加@则会回显命令)

.PHONY:命令名称

可以理解成makefile的:“关键字”,被其修饰的命令即具有一个特征:总是被执行的
即总是会根据依赖关系无障碍运行

伪目标也是目标,与mybin一样同为目标

使用.PHONY修饰后,该命令即默认总是被执行的,不会因为其它因素而不执行

如:

.PHONY:clean

clean:

        @rm -f filename

为什么make只能执行一次,第二次则不被执行?
(当文件未进行修改时,且命令未被.PHONY修饰)

因为编译需要时间成本(大型程序需要很长时间),所以Linux限制了重复执行生成同一个程序

makefile如何识别文件是否为最新状态?

通过比对源文件与可执行程序的修改时间来判断可执行程序是否为最新状态
所以当可执行程序未被清理时,重新对源文件进行编译,则可能并未生成最新的源文件对应的可执行程序

 使用make/makefile的好处

  1. 只需要写依次makefile,保证makefile没有写错,则make即可直接正确编译程序
  2. 编写一次makefile,后续修改了源文件内容,直接清理再make即可,不需要重新对每个源文件依次编译

makefile编写时的一些快捷符号

如图所示:makefile中有些许符号可以批量指定目标,当源文件繁多可以使用其简化makefile

gdb

gdb是Linux下常用的一款调试代码的工具

但由于Linux下是命令行操作,使用gdb进行调试对新手来说也十分的不友好,需要多加练习

首先调试前我们要知道的有

  • 程序的发布方式有两种,debug模式和release模式
    前面我们知道了Linux下gcc/g++编译出来的二进制程序,默认是动态链接的release模式
    • release一般是软件进行发布,并交付给用户的模式,不包含调试信息
    • debug一般是开发时进行发布的,包含了调试信息
      所以debug生成的程序在体积上一定是大于release的
  • 要使用gdb调试,必须在源代码生成二进制程序(.o文件)的时候, 加上 -g 选项[重要]

readelf 程序名 可查看程序的一个段信息

readelf -Sh 程序名 | grep 'debug'
查看程序的段信息里是否包含debug的信息(也就是调试信息)

 简单介绍完后,我们一起来了解一下gdb下的常用命令吧

  • gdb指令:gdb会记录最近一条命令,如果命令不变换可以直接按回车执行
    • l(list):显示代码
      如 l 5:显示第五行包括其前后的代码
    • b(breakpoint):打断点
      如 b 5:在第五行打一个断点
    • info b:显示断点信息
      • (gdb) b 13
        输出:Breakpoint 1 at 0x400563:file main.c, line 13.
      • (gdb) info b
        输出:Num Type Disp Enb Address What
        1 breakpoint keep y 0x0000000000400563 in main at main.c:13
    • d(delete):删除断点
      • d num:删除对应num号的断点
        • (gdb) d 1
        • (gdb) info b(删除不存在的断点)
          No breakpoints orwatchpoints.
    • r(run):运行代码到断点处
      无断点直接运行会运行到程序结束
    • c(continue):运行到下一个断点处
    • n(next):逐过程运行代码
    • s(step):逐语句执行代码
    • display:常显示(添加监视项)
      如 display 变量名 运行时显示变量结果
    • undisplay :删除监视项
      如 undisplay 编号 删除对应的监视项
    • until:跳转至指定行
    • r(repeat):程序未结束时跳转至第一个断点处重新开始调试
    • finish:结束某个函数调用,直接出结果,然后停下
    • bt:查看当前调用堆栈
    • disable/enable 断点:使能(打开/关闭)断点(不删除断点,但禁用了该断点)

写在最后

        以上就是关于在Linux下的常用软件了,如果对你有帮助,请给个三连呀~点赞评论转发让更多人看到

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c.Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值