关于Linux下的常用软件工具

2023-05-16

目录

前言:

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下的常用软件了,如果对你有帮助,请给个三连呀~点赞评论转发让更多人看到

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Linux下的常用软件工具 的相关文章

  • ulimit -r 返回不同的值

    我将以下两行添加到系统范围的 etc security limits conf 中 soft rtprio 55 hard rtprio 55 系统重新启动后 根据我在计算机上访问用户帐户的方式 我会得到两个不同的结果 user clien
  • top命令的CPU使用率计算

    我正在尝试使用 GNU coreutil top 的公式来计算 CPU 使用率的百分比 但 top 正在使用一些 half total 来计算百分比 即在百分比上添加 0 5 在top的utils c中 以下行 在 3 8 beta1 中
  • 无法声明接口:资源繁忙

    我正在使用 USB4Java 低级版本 并且基本上是根据这段代码工作的here http www mets blog com java usb communication usb4java 我在 Ubuntu 中工作 遇到了有关权限的问题
  • 32 位 x86 汇编中堆栈对齐的职责

    我试图清楚地了解谁 调用者或被调用者 负责堆栈对齐 64 位汇编的情况相当清楚 它是由caller 请参阅系统 V AMD64 ABI 第 3 2 2 节栈帧 输入参数区域的末尾应按 16 对齐 32 如果 m256 在堆栈 字节边界上传递
  • 如何安装 Node 和 NPM 以便不必使用 sudo?

    我正在尝试在 Ubuntu 14 04 计算机上设置 Node js 和 NPM 但遇到了一些问题 在我的第一次尝试中 我不断得到EACCES尝试安装软件包时出错 有时甚至使用sudo 所以我彻底卸载了node和npm 现在我正在尝试找出如
  • 在Linux上如何找到当前目录的所有直接子目录?

    在Linux上如何找到当前目录的所有直接子目录 最简单的方法是通过编写来利用 shell 通配功能echo 如果你喜欢使用ls 例如要应用格式 排序选项 请使其ls d 解释 斜杠确保仅考虑目录 而不考虑文件 Option d 列出目录本身
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何仅使用 grep/sed 提取子字符串和数字

    我有一个包含文本和数字的文本文件 我想使用 grep 只提取我需要的数字 例如 给定一个文件如下 miss rate 0 21 ipc 222 stalls n shdmem 112 所以说我只想提取数据miss rate这是0 21 如何
  • 如何解决错误:psycopg2 构建轮失败?

    我遇到问题了psycopg2 的构建轮子 thru pip install r requirements txt 我使用的是 ubuntu 20 04 python 3 8 5 venv 这是我的要求 txt amqp 2 6 1 anyj
  • 使用 C++ 更改终端字体大小

    我正在用 C 做一个小项目 在 Ubuntu 11 04 中 该程序是基于文本的 全部在 Gnome 终端中 我正在使用 ncurses 库来更改字体颜色 但我也想将不同大小的文本打印到终端 并且不知道如何使用 ncurses 来做到这一点
  • 将 React 应用程序作为后台进程运行

    我对部署前端代码完全陌生 因此提出了这个问题 我有一个 React 应用程序 需要作为后台进程运行 但是我对如何执行此操作有点困惑 我运行一个 npm 脚本 npm run build 在服务器上构建 缩小和服务项目 构建过程的相关代码是这
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • (Linux) 如何在没有显示环境的情况下运行gtk程序? Gtk-警告 **:无法打开显示:

    我有一个必须在 GTK gui 环境中运行的程序 我只能使用ssh 该程序将在服务器 centos 6 上运行并安装 gnome X 显示 不需要看GUI 但运行完成后 我就能得到答案 VNC 和远程屏幕已禁用 当我在 ssh 中启动程序时
  • Linux/UNIX 中 COM 编程的模拟

    组件对象模型 COM 是 或者曾经是 Windows 中提供语言中立的软件组件的方式 Linux UNIX 中是否有任何编程模型具有与通过二进制组件重用代码相同的理念 Sun RPC http en wikipedia org wiki R
  • 捕获活动窗口中的变化(适用于 Linux)

    有没有办法知道 linux x windows 用户何时通过 alt tab 或单击更改活动窗口 我想编写一个监听此事件的脚本 如果发生此类事件 该脚本将继续查找当前活动窗口 我知道如何解决 我还可以继续轮询以查找当前活动窗口 但这是一种不
  • 我想要 Linux 上的 C 函数来收集核心转储而不终止进程

    abort 确实收集核心转储 但我不希望进程终止 dump core 收集核心转储 但在内核空间中 用户空间中是否有与 dump core 等效的函数 自己做的一个简单方法是fork进程 创建父进程的完整副本 并调用abort来自子进程 子
  • Linux 相当于 GetCommandLine 和 CommandLineToArgv?

    我想知道是否有一些 API 可以在 Linux 上获取当前进程的命令行参数 我想我是非常不清楚的 该问题的真正目的是通过命令行参数传递 unicode 文件名 从文件中读取 proc self cmdline 例如 wallyk zf od
  • 如何显示带有完整路径或文件名的“grep”结果[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 使用时如何获取完整的文件路径grep 我使用类似的命令 cat log grep somethingtosearch 我需要显示结果以及从
  • bash 脚本中自动 docker 登录

    我如何提交我的凭据docker login脚本中的命令 我使用的 bash 脚本基本上自动化了设置自定义虚拟机等的整个过程 但是当我需要在脚本中登录 docker 来提取映像时 我收到以下错误 用户名 FATA 0000 设备的 ioctl
  • 对于 Linux 上的 ARM,从 *.hex 转换为 *.bin

    我想使用以下命令将程序上传到我的 STM32F4 Discovery 板st flash命令 问题是当我尝试上传 hex 或 elf 文件时 它不起作用 我尝试了多种方法 例如使用 xxd 从 elf 或 hex 转换为 bin 但当我上传

随机推荐

  • LAMP网站架构

    一 LAMP网站架构 1 1 基本定义 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写 Linux xff0c 操作系统Apache xff0c 网页服务器 MariaDB或MySQL xff0c 数据库管理系
  • pancakeswap薄饼添加流动性后实现永久锁仓

    添加完流动性后 xff0c 永久锁仓就是放弃对资金池的控制 xff0c 就是放弃了对流动性的所有权 xff0c 没有办法撤池子了 现在锁仓分为2种 xff0c 一个是丢黑洞永久锁仓 xff0c 另外一种是短期锁仓 xff0c 锁在智能合约中
  • ubuntu14.04 root用户登录方法

    如果你是刚刚装完ubuntu14 04系统 xff0c 你进去后是以普通用户登录的 xff0c 很多操作并没有权限 xff0c 要想获得全部权限可以以root用户登录 1 先解除root锁定 xff0c 为root用户设置密码 打开终端输入
  • pycharm终端常用指令

    在调试ppddle的时候下载的coco数据集过大 xff0c 一时没有注意不急的如何终止 xff0c 所以转载一个记一下 Terminal快捷键 功能 Tab 自动补全 Ctrl 43 a 光标移动到开始位置 Ctrl 43 e 光标移动到
  • 解决Mac电脑因kotlin插件禁用导致的Android Studio无法打开问题

    解决这个办法需要将Android Studio目录下的disabled plugins txt文档中的org jetbrains kotlin删除即可 文件位置 Users mac Library Application Support G
  • 实现生产者消费者进程(Java)

    目录 前言 一 实验要求 二 步骤 1 主类 2 消费者 3 生产者 4 超市 前言 消费者问题是操作系统中典型的进程同步互斥问题 xff0c xff08 英语 xff1a Producer Consumer problem xff09 x
  • python | Pandas库数据预处理-缺失值篇:info()、isnull()、dropna()、fillna()函数

    相关文章 python Pandas库导入Excel数据 xff08 xlsx格式文件 xff09 函数 xff1a read excel python Pandas库导入csv格式文件函数 xff1a read excel 目录 数据源
  • vue3学习笔记 2023

    vue文件 34 组件 34 是一种封装的思想 把相关业务逻辑的 34 js css html 34 都封装到一起 当需要调用 34 组件 34 的时候 只需要在html中期望的位置插入对应的 34 标签 34 即可 比如封装了一个 34
  • STP详解

    STP STP全称为 生成树协议 xff08 Spanning Tree Protocol xff09 xff0c 是一种网络协议 xff0c 用于在交换机网络中防止网络回路产生 xff0c 保证网络的稳定和可靠性 它通过在网络中选择一条主
  • 【Linux】线程篇---线程安全&&生产者消费者模型

    目录 1 线程安全概念 2 互斥的实现 2 1互斥锁 2 2互斥锁原子性的保证 2 3互斥锁接口 2 3 1初始化互斥锁 2 3 2互斥锁加锁接口 2 3 3解锁接口 2 3 4 销毁互斥锁接口 2 4代码验证锁的接口 3 同步的实现 3
  • 收藏版|史上最全机器学习优化器Optimizer汇总

    转载于收藏版 xff5c 史上最全机器学习优化器Optimizer汇总 掘金 juejin cn 作者 xff1a 苏学算法 链接 xff1a https juejin cn post 7084409806492008456 来源 xff1
  • 三种图像内插法(最近邻内插法、双线性内插法、双三次内插法)的做法 & 代码实现

    参考博客 数字图像处理学习笔记 xff08 四 xff09 数字图像的内插 度量 表示与质量 闭关修炼 暂退的博客 CSDN博客 数字图像处理学习笔记 xff08 七 xff09 用Pycharm及MATLAB实现三种图像内插法 xff08
  • Java实现生产者消费者案例

    目录 一 生产者消费者模式概述 二 生产者消费者案例 三 代码 奶箱类 xff08 Box xff09 生产者类 xff08 Producer xff09 xff1a 消费者类 xff08 Customer xff09 xff1a 测试类
  • 深度学习 - TensorFlow Lite模型,云侧训练与安卓端侧推理

    TensorFlow Lite模型 xff0c 云侧训练与安卓端侧推理 引言一 云侧深度模型的训练代码1 加载数据集的格式分析1 1 从数据集加载的数据格式1 2 对加载的数据进行处理 2 深度模型搭建3 模型训练 评估 保存 转换4 模型
  • /system/core/init/readme.txt对init.rc的解释

    init rc由许多的Action和Service组成 每一个语句占据一行 xff0c 并且各个关键字被空格分开 c规范中的 xff08 如 n xff09 反斜杠将被忽略 backslash escapes 而被认为是一个空格 xff0c
  • 操作系统---“进程调度模拟程序” , “生产者―消费者问题算法的实现” , “银行家算法的实现”

    如果有正在学习计算机操作系统的小伙伴 xff0c 可以通过此文章对 进程调度模拟程序 生产者 消费者问题算法的实现 银行家算法的实现更加清楚 本人也只是一个学生 xff0c 下面内容我主要整合了一些学习心得和成果 xff0c 还有能够帮助自
  • 电脑桌面美化教程,强迫症福利

    目录 一 透明任务栏 效果图展示 二 桌面图标的布局美化 效果展示 行为 主题 一般设置 添加项目 总结 首先给大家看一下我美化后的桌面 我比较喜欢简约风格的 xff0c 看起来就很舒服 xff0c 也可以根据自己的喜欢添加一些小特效 xf
  • 深入理解设计模式之建造者模式

    老大突然拉住我 xff0c 喜滋滋地告诉我 公司很满意我们做的模型 xff0c 又签订了一个合同 xff0c 把奔驰 宝马的车辆模型都交给我们公司制作了 xff0c 不过这次额外增加了一个新需求 汽车的启动 停止 喇叭声音 引擎声音都由客户
  • 如何改变Android-studio中的APP的名字和图标

    1 更改APP的名字 1 xff09 xff1a 我们打开app gt manifests gt AndroidManifest xml 更改Android xff1a lable 61 34 34 引号之中的文字即可 在这里我们改为QQ
  • 关于Linux下的常用软件工具

    目录 前言 xff1a vim gcc gcc c 43 43 make makefile gdb 写在最后 前言 xff1a 本篇主要介绍的是Linux下几种常用的软件的使用 关于Linux下软件的安装 xff0c yum源的配置请点击