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

Linux:基础开发工具

文章目录

  • Linux 软件包管理器 yum
    • 什么是软件包
    • 关于rzsz
    • 查看软件包
    • 安装软件
    • 卸载软件
    • 安装扩展源
  • Linux 编辑器 vim
    • vim的基本概念
      • 正常/普通/命令模式(Normal mode)
      • 插入模式(Insert mode)
      • 底行模式(last line mode)
    • vim的基本操作
      • [命令模式]切换至[插入模式]
      • [插入模式]切换至[命令模式]
      • [命令模式]切换至[底行模式]
      • 退出vim
    • vim命令模式
    • 底行模式
  • Linux 编译器 gcc/g++
  • 默认编译
    • 预编译
    • 编译
    • 汇编
    • 链接
      • 动态库和静态库
      • 动态链接和静态链接的对比
  • Linux 项目自动化构建工具 make/makefile
  • Linux 调试工具 gdb
    • debug和release
    • gdb指令

Linux 软件包管理器 yum

什么是软件包

在Linux下安装软件有三种方式:源代码安装、rpm安装、yum安装。

源代码安装就是下载程序的源代码,并进行编译,得到可执行程序。

但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。

软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。

关于rzsz

这个工具用于Windows机器和远端的Linux机器通过XShell传输文件。

安装完毕之后可以通过拖拽的方式将文件上传过去。

注意:关于yum的所有操作必须保证那个主机(虚拟机)网络畅通!

可以通过ping指令验证:

ping ww.baidu.com

在这里插入图片描述

查看软件包

通过 yum list 命令可以罗列出当前一共有哪些软件包.。由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包.。例如:

yum list | grep lrzsz

结果如下:
在这里插入图片描述

注意:

  1. 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
  2. “x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.
  3. “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6.
  4. 最后一列, base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店” 这样的概念.

安装软件

通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装

sudo yum install lrzsz

yum 会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装.

出现 “complete” 字样, 说明安装完成.

在这里插入图片描述

注意:

  1. 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
  2. yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.

卸载软件

卸载命令

sudo yum remove lszrz

安装扩展源

尽管yum已经为我们准备了很多软件,但也有很多软件在yum上找不到,所以yum还有一个扩展源,是一些还没有进入yum的软件,但是以后可能会进入yum,但现阶段还不成熟。如果我们就是想要使用yum扩展源中的软件,就需要我们先下载yum扩展源,然后再按照之前的方法下载软件即可。

安装扩展源命令:

yum install -y epel-release

Linux 编辑器 vim

vim的基本概念

vim是一个多模式的编辑器,本文主要介绍最常用的三种模式:命令模式(Normal mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按ESC键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

底行模式(last line mode)

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,: 即可进入该模 式。

添加行号:set nu

去除行号:set nonu

要查看你的所有模式:打开vim,底行模式直接输入:help vim-modes

三种模式的相互切换:

在这里插入图片描述

vim的基本操作

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面。不过有一点要特别注意,就是在进入vim之后,是处于[命令模式],要切换到[插入模式]才能够输入文字。

[命令模式]切换至[插入模式]

输入:a,i,o均可

[插入模式]切换至[命令模式]

目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下`ESC键转到[命令模式]再删除文字。当然,也可以直接删除。

[命令模式]切换至[底行模式]

shift + ;, 其实就是输入:

退出vim

在[底行模式]下:

w:保存当前文件

wq:保存并退出vim

q:不保存退出vim

q!/wq!:强制执行操作

vim命令模式

常用指令:

指令含义
gg定位光标到最开始行
G定位光标到结尾行
n + G光标定位到任意行
(n)+ yy赋值光标所在行和其下(n - 1)行
(n) + p粘贴n重复行到光标下一行
(n) + dd剪切/删除
u撤销
CTRL + r反撤销
$定位光标到当前行结尾
^定位光标到当前行开始
w/b光标按单词在行内/跨行移动
h/j/k/l光标左下上右移动
shift + ~快速大小写切换
(n) + r对光标及之后位置进行批量替换
(n) + x对光标及之后位置的字符删除
R批量替换模式(Esc退出)

底行模式

「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往后寻找到想要的关键字为止。

「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往前寻找到想要的关键字为止。

Linux 编译器 gcc/g++

两种编译器的用法几乎相同,区别在于:gcc只能编译C语言,g++可以编译C语言和C++。

以下介绍以gcc为例。

默认编译

使用gcc编译代码时,需要使用指令:

gcc test.c

这样会生成一个a.out文件,在当前目录下使用./a.out即可执行该程序。

因为gcc编译生成的文件默认文件名为a.out,编译后生成可执行文件,就可以使用相对路径执行该文件。

如果想为生成的文件命名,需要添加-o [文件]选项。

预编译

编译过程分为:预编译(进行宏替换)、编译(生成汇编代码)、汇编(生成二进制文件)、链接(生成可执行文件或库文件)四个过程。

预编译的作用:

  1. 展开头文件
  2. 条件编译
  3. 宏替换
  4. 去注释

所以经过预编译后的文件仍为C语言文件。

如果想得到预编译后的文件,可以使用-E选项。同时使用-o [文件]选项来命名生成的文件。

gcc -E test.c -o test.i

命名预编译后的文件没有硬性的规则,不过一般我们把经过预编译后的文件命名为.i文件。

编译

编译过程将C/C++文件转成汇编文件。

如果想得到编译后的文件,可以使用-S选项。同时使用-o [文件]选项来命名生成的文件。

gcc -S test.i -o test.s

我们一般将编译后的文件命名为.s文件。

需要注意的是,我们可以对test.i编译,也可以对test.c编译,前者是直接编译,后者是先预编译再编译,生成的汇编文件没有区别。

汇编

汇编过程将汇编代码转换为二进制代码。

gcc -c test.s -o test.o

汇编生成的文件称为可重定位目标二进制文件,简称目标文件,在Linux下后缀一般为.o,在Windows下后缀为.obj

目标文件还不能执行,要想生成一个可执行程序,还要进行最后一步:链接。

链接

目标文件和库进行链接形成可执行程序。

库(库文件):提供给我们方法的实现,如printf等。

C语言的标准库,本质就是一个文件,有自己的路径。

动态库和静态库

Linux下动态库后缀为.so,静态库后缀为.a,库的命名规则为libname.so.xxx,其中name是区分不同库文件的部分,其余部分相同。

Windows下动态库后缀为.dll,静态库后缀为.lib

链接分为动态链接和静态链接,动态链接用到的库称为动态库,静态链接用到的库称为静态库。

Linux下动态库的路径:/lib64/libc.so,静态库的路径:/lib64/libc.a

静态链接时,在程序运行的过程中会到动态库中查找所需方法,所以动态库不能缺失,缺失后不致影响一个程序,很多程序都无法正常运行;在编译器使用静态库进行静态链接时,将自己的方法拷贝到目标程序中,该程序以后不再依赖库。

在Linux中,编译形成的可执行程序,默认采用动态链接,如果要按照静态链接的方式进行编译,需要加-static选项。

如果没有静态库,使用-static会报错。

如果没有动态库,有静态库,而且编译器能找到,也可以编译。

-static的本质:改变优先级,且只适配一次,即一旦声明-static,就不会再使用动态库。

查看文件链接的库以及链接方式的指令:flie [文件]

动态链接和静态链接的对比

动态库时共享库,有效的节省资源(磁盘空间,内存空间,网络空间)。但动态库一旦缺失,各个程序都无法正常运行。

静态库不依赖库,程序可以独立运行,但程序体积大,比较消耗资源。

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

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

例如当我们写出一个C语言文件test.c

#include <stdio.h>int main()
{printf("Hello Linux\n");return 0;
}

我们可以在同一目录下创建一个makefile文件,并在其中写

test:test.cgcc -o test test.c.PHONY:clean
clean:rm -f test

其中第一行和第五行叫做依赖关系,第二行和第六行叫做依赖方法。

make是否执行:比较可执行程序的最近修改时间和源文件的最近修改时间,如果.exe新于.c,则不执行make,如果.exe老于.c,则执行make。

.PHONY:[文件]可以使该文件忽略时间,总是被执行。

使用make时,后面要加指令,如:make clean,如果不加指令,默认执行makefile中的第一条指令。

Linux 调试工具 gdb

debug和release

在Linux下,编译生成的可执行程序默认是release版本,无debug信息,想要生成debug版本的可执行程序,需要在编译时加-g选项。

readelf:可以读取可执行程序文件的指令。

readelf -S [文件] | grep -i debug

可以查看文件中有没有debug信息。

gdb指令

指令含义
l [行号/函数名]查看代码
r启动程序(到断点停下)
b [行号/函数名]打断点
info b查看断点
d [断点编号]取消断点
n逐过程调试
s逐语句调试
p [变量]查看变量值
display [编号]常显示变量值
undisplay取消常显示
until [行号]跳转至x行
finish直接结束当前函数
c运行到下一个断点
disable [编号]关闭断点
enable [编号]打开断点

相关文章:

Linux:基础开发工具

文章目录 Linux 软件包管理器 yum什么是软件包关于rzsz查看软件包安装软件卸载软件安装扩展源 Linux 编辑器 vimvim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)底行模式(last line mode) vim的基本操作[命令模式]切换至[插入模式][插入模式]切换至[命令模…...

HarmonyOS NEXT Push接入

接入HarmonyOS NEXT Push 推送功能&#xff0c;相比于 Android 真的是简单太多。不再需要适配接入各个厂家的推送 SDK&#xff0c;真是舒服。 1.开通推送服务与配置Client ID 1.1 创建应用获取Client ID 按照官方文档来就可以了&#xff1a;https://developer.huawei.com/co…...

如何快速入门Element-UI:打造高效美观的前端界面

Element-UI 是一款基于 Vue.js 的开源组件库,提供了丰富的 UI 组件,可以帮助开发者快速构建美观、响应式的前端界面。本文将详细介绍如何快速入门 Element-UI,包括环境搭建、组件使用、样式定制及常见问题解决方法,帮助你高效地使用 Element-UI 进行前端开发。 一、环境搭…...

Langchain的向量存储 - Document示例代码里的疑问

文章目录 前言一、语句分析二、 举例解释三、 完整代码总结 前言 之前的代码里有下面这句话&#xff0c;可能有看不明白的读者。 vectors [embeddings.embed(doc.page_content) for doc in docs]今天一起来看下这句话。 一、语句分析 这句话实际上是一个列表推导式&#x…...

Docker 教程-介绍-2

快速了解docker有什么。 Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;基于Go语言开发&#xff0c;并遵循Apache 2.0协议。它允许开发者将应用及其依赖包打包进一个可移植的容器中&#xff0c;这些容器可以发布到任何支持Docker的Linux或Windows机器上&#xff0c…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 伐木工(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 伐木工(200分) 🌍 评测功能需要订阅专栏后私信联系清隆解…...

UltraScale+系列模块化仪器,可以同时用作控制器、算法加速器和高速数字信号处理器

基于 XCZU7EG / XCZU4EG / XCZU2EG • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 基于 Xilinx Zynq UltraScaleMPSoC 的 FPGA 技术&#xff0c;采用 Xilinx Zynq UltraScale&a…...

Python与其他编程语言(如Java、C++)相比有哪些优势?

一、技术难点 在探讨Python与其他编程语言相比的优势时&#xff0c;技术难点在于如何全面、准确地把握并阐述这些优势。这需要对Python、Java、C等编程语言有深入的理解&#xff0c;包括它们的语法特性、应用领域、性能特点、开发效率等。 首先&#xff0c;Python的语法简洁明…...

Edge浏览器双击关闭标签页,双击关闭浏览器选项卡

设置》外观》自定义浏览器&#xff0c;开启“使用双击关闭浏览器选项卡” 设置里面搜索“双击”&#xff0c;这是最快的方式 鼠标滚轮单击 或者进入“设置”-“辅助功能” 呼吁已久的功能来了&#xff01;Edge浏览器双击关闭标签页功能上线新 国产浏览器大多都有双击关闭标签页…...

C++ 贪心算法——跳跃游戏、划分字母区间

一&#xff1a;跳跃游戏 55. 跳跃游戏 题目描述&#xff1a;给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1…...

汽车数据应用构想(三)

上期说的&#xff0c;用数据去拟合停车信息的应用&#xff0c;那么类似的POI信息相关的场景其实都可以实现。今天讲讲用户使用频率也很高的加油/充电场景。 实际应用中&#xff0c;在加油场景中用户关心的通常还是价格。无论是导航还是各种加油APP/小程序&#xff0c;都已经很…...

体素技术在AI绘画中的革新作用

随着人工智能技术的不断进步&#xff0c;AI绘画已经成为艺术创作和视觉设计领域的一大趋势。在众多推动AI绘画发展的技术中&#xff0c;体素技术以其独特的优势&#xff0c;正在逐渐改变着我们对计算机生成图像的认识。本文旨在探讨体素技术在AI绘画中的应用与影响&#xff0c;…...

Leetcode.866 回文质数

题目链接 Leetcode.866 回文质数 rating : 1938 题目描述 给你一个整数 n n n &#xff0c;返回大于或等于 n n n 的最小 回文质数。 一个整数如果恰好有两个除数&#xff1a; 1 1 1 和它本身&#xff0c;那么它是 质数 。注意&#xff0c; 1 1 1 不是质数。 例如&#xf…...

【论文阅读】Point2RBox (CVPR’2024)

paper:https://arxiv.org/abs/2311.14758 code:https://github.com/yuyi1005/point2rbox-mmrotate...

深度学习的点云分割

深度学习的点云分割 点云分割是计算机视觉中的一个重要任务&#xff0c;特别是在三维数据处理和分析中。点云数据是由大量三维点构成的集合&#xff0c;每个点包含空间坐标&#xff08;x, y, z&#xff09;&#xff0c;有时还包含其他信息如颜色和法向量。点云分割的目标是将点…...

【知识点】c++模板特化

在 C 中&#xff0c;模板特化分为全特化&#xff08;full specialization&#xff09;和偏特化&#xff08;partial specialization&#xff09;。它们允许程序员为特定类型或类型模式提供不同的实现&#xff0c;以覆盖通用模板的默认行为。 模板全特化 模板全特化是指为某个…...

算法家族之一——二分法

目录 算法算法的打印效果如果算法里的整型“i”为1如果算法里的整型“i”为11 算法的流程图算法的实际应用总结 大家好&#xff0c;我叫 这是我58&#xff0c;现在&#xff0c;请看下面的算法。 算法 #define _CRT_SECURE_NO_WARNINGS 1//<--预处理指令 #include <stdi…...

【深度学习】PuLID: Pure and Lightning ID Customization via Contrastive Alignment

论文&#xff1a;https://arxiv.org/abs/2404.16022 代码&#xff1a;https://github.com/ToTheBeginning/PuLID 文章目录 AbstractIntroductionRelated WorkMethods Abstract 我们提出了一种新颖的、无需调整的文本生成图像ID定制方法——Pure and Lightning ID customizatio…...

Elastic 8.14:用于简化分析的 Elasticsearch 查询语言 (ES|QL) 正式发布

作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 8.14 正式发布。 什么是新的&#xff1f; 8.14 版本最重要的标题是 ES|QL 的正式发布(GA)&#xff0c;它是从头开始设计和专门构建的&#xff0c;可大大简化数据调查。在新的查询引擎的…...

C语言指针与数组的区别

在C语言中&#xff0c;指针和数组虽然在很多情况下可以互换使用&#xff0c;但它们在概念上和行为上存在一些区别。下面详细解释这些区别&#xff1a; ### 数组 1. **固定大小**&#xff1a;数组在声明时必须指定大小&#xff0c;这个大小在编译时确定&#xff0c;之后不能改…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...