Linux 基础开发工具的使用
目录
前言
一:下载工具yum
二:文本编辑器vim
1. 命令模式
2. 插入模式
3. 底行模式
三:gcc和g++
基本使用格式
常用选项及作用
编译过程示例
四、Linux 项目自动化构建工具 ——make/Makefile
1. make 与 Makefile 的关系
2. Makefile 的原理
3. Makefile 的推导规则
四:调试工具(gdb)
五.git
总结
前言
本篇内容给大家带来的是在Linux下一些常见基础开发工具的使用,这些工具有些需要先下载好才能使用,如果一开始没有该工具,系统应该会提示要如何下载,也会有工具是需要经过配置的,大家多动动小手,搜搜教程,都不难配置的
工具:本质也是指令
一:下载工具yum
linux如何下载安装?
不同的社区,在自己的linux中,内置服务器和应用对应的下载链接——>yum(等同于手机上的应用商店)
可以通过yum搜索安装删除相应的软件
yum install 软件名:安装这个软件
yum lis:列举出可以安装的软件
yum remove 软件名 :删除这个软件
rzsz软件 rz :将win上文件传到linux上 sz:将linux上文件传到win上
二:文本编辑器vim
vim 是一种功能强大的多模式编辑器(类似记事本,但功能更丰富)
让我们来见一见vim
(我这个是配置过的,大家一开始打开vim可能会很简陋,得去搜教程配置一下才好用一些)
下面来介绍一下vim该如何使用
1. 命令模式
- 进入方式:vim 打开之后的默认模式。
- 模式切换:
- 输入
i
可从命令模式转到插入模式。 - 输入
shift + :
可进入底行模式。
- 输入
- 光标定位操作:
shift + 4
:将光标定位到当前行的最后位置(行右)。shift + 6
:将光标定位到当前行的最前位置(行左)。shift + g
:将光标定位到最后一行的开始位置(底部)。gg
:将光标定位到第一行的开始位置(顶部)。n + shift + g
:将光标跳转至指定行,其中n
代表行号。
- 光标移动操作:
h
:向左移动。j
:向下移动。k
:向上移动。l
:向右移动。
- 文本操作:
- 复制粘贴:
yy
:复制光标所在行(nyy
:支持复制光标所在行及其后的n
行)。p
:粘贴(np
:支持粘贴n
行内容)。
- 撤销恢复:
u
:撤销操作。ctrl + r
:取消u
操作(恢复撤销的操作)。
- 删除剪切:
dd
:删除光标所在行(ndd
:支持删除n
行)。ndd + p
:实现剪切操作(先删除n
行,再粘贴,等同于剪切)。
- 复制粘贴:
- 文本编辑操作:
- 大小写切换:
shift + ~
可切换文本行的大小写。 - 批量替换:
shift + r
可进行批量化替换。 - 字符替换:
r
可替换光标所在的一个字符(nr
支持替换n
个字符)。 - 行内删除:
x
:向后删除一个字符(nx
支持向后删除n
个字符)。X
(即shift + x
):向前删除一个字符(nX
支持向前删除n
个字符),删除后支持p
进行粘贴。
- 单词移动:
w
:向后按单词移动。b
:向前按单词移动。
- 字词更改:
c + w
:更改光标所在处的字到字尾处。c#w
(如c3w
):表示更改 3 个字。
- 大小写切换:
2. 插入模式
- 进入方式:输入
i
(在光标前插入)、a
(在光标后插入)、o
(在当前行下新开一行插入)可进入插入模式。 - 退出方式:按
esc
回到命令模式。
3. 底行模式
- 行号显示控制:
set nu
:显示行号。set nonu
:取消显示行号。
- 分屏操作:
vs 文件名
可分屏显示指定文件。无论分多少屏幕,始终只有一个光标。光标的跨屏移动操作是ctrl + ww
。 - 执行 Linux 命令:在底行输入
!
,可执行 Linux 命令。 - 全局替换操作:格式为
%s/要替换的原字符/要替换的新字符/g
。例如%s/cout/printf/g
,意思是把全局的cout
替换成printf
,其中g
代表全局。
通用操作:无论是哪种模式,按esc
就能回到命令模式。
三:gcc和g++
在 Linux 系统中,gcc
和g++
是 GCC 套件里用于编译 C 和 C++ 程序的重要工具 。gcc
专门用于 C 语言程序编译,g++
则用于 C++ 程序编译。虽然在编译 C 程序时二者表现可能相似,但处理 C++ 程序时,g++
会链接 C++ 标准库,gcc
默认链接 C 标准库。
基本使用格式
gcc (选项) 要编译的文件 (选项) (目标文件)
g++ (选项) 要编译的文件 (选项) (目标文件)
常用选项及作用
-E
:仅进行预处理,处理宏定义、文件包含(#include
)、条件编译(如#ifdef
、#ifndef
、#endif
)以及删除注释等操作,不进行编译和汇编。例如gcc -E hello.c -o hello.i
,会生成预处理后的hello.i
文件。-S
:生成汇编代码,在预处理、编译后停止汇编和链接步骤。如gcc -S hello.i -o hello.s
,会得到汇编文件hello.s
。-c
:生成目标代码(.o 文件),完成预处理、编译、汇编后,停止链接操作。像gcc -c hello.s -o hello.o
,可生成二进制目标文件hello.o
,但它还不能直接执行。-o
:用于指定输出文件名。比如gcc hello.o -o hello
,将hello.o
与必要库链接后,生成名为hello
的可执行文件。-static
:使用静态链接生成可执行文件,会把库代码直接复制到可执行文件中,文件较大,但运行时无需依赖库文件 。-g
:生成调试信息,供GDB
等调试器使用。默认不指定该选项时,编译类似 Release 模式,进行优化但无调试信息;若要用GDB
调试程序,编译时需加-g
选项,如g++ -g my_program.cpp -o my_program
。
编译过程示例
一个 C 或 C++ 程序从源代码到可执行文件,通常经预处理、编译、汇编和链接四个步骤:
- 预处理:以 C 语言的
hello.c
为例,gcc -E hello.c -o hello.i
,对hello.c
进行宏替换、文件包含展开等,生成预处理后的hello.i
。 - 编译:
gcc -S hello.i -o hello.s
,检查hello.i
代码规范性、语法错误等,将其翻译成汇编语言,得到hello.s
。 - 汇编:
gcc -c hello.s -o hello.o
,把hello.s
汇编代码转成机器可识别的二进制目标代码,生成hello.o
。 - 链接:
gcc hello.o -o hello
,将hello.o
与程序所需库(如 C 标准库libc.so.6
)合并,生成最终可执行文件hello
。实际中,常直接用gcc hello.c -o hello
,一次性生成可执行文件。 对于 C++ 程序,如test.cpp
,使用g++ test.cpp -o test
即可编译生成可执行文件test
。
使用 g++ 编译时,通过 -std 选项指定支持 C++11 及以上标准 修改编译命令为 g++ test.cpp -o testcpp -static -std=c++11
四、Linux 项目自动化构建工具 ——make/Makefile
1. make 与 Makefile 的关系
make
是一个命令工具,用于解释Makefile
文件中的指令。Makefile
是一个文件,它带来的好处是实现自动化编译。一旦编写完成,只需执行一个make
命令,整个工程就能完全自动编译,极大地提高了软件开发的效率。make
默认情况下只生成一个可执行目标文件,后续的依赖关系和依赖方法不再执行。
2. Makefile 的原理
Makefile
的存在是为了构建项目,主要包含以下两方面:
- 依赖关系:依赖关系可以为空。
- 依赖方法:
- 语法示例:
mycode:mycode.c # 表示mycode依赖于mycode.c,这是依赖关系gcc mycode.c($^) -o mycode($@) # 前面需用Tab键缩进,这是依赖方法,说明如何从依赖文件形成可执行程序# ($<:表示规则中的第一个依赖文件).PHONY:clean
clean:rm -f mycode# (.PHONY:被该关键字修饰的对象是一个伪目标,表示该目标总是被执行的)
举例:
原先是没有process_pool的
执行make代码
可以看到此时make之后就有对应的可执行程序了
使用make clean就可以删除对应的可执行程序(我们的make是只能顺着往下执行第一个脚本命令的,如果想执行其他的,就得写PHONY,然后在make后面指明对应的脚本)
- 时间相关知识:
- 使用
stat
查看文件的三个时间,分别为最近访问时间(access)、最近修改内容时间(modify)、最近修改文件属性时间(change)。一旦修改了文件内容,文件属性也会被更改,因为文件属性包括文件大小,修改内容会影响大小。最近访问时间是在访问达到一定次数后才修改,否则如果访问太频繁,就要不断去磁盘中修改属性。 - 对于
gcc/g++
来说,判断源程序是否需要重新编译是通过比较源程序和源文件最近被修改的时间来解决的。如果源文件时间晚于源程序,那就再进行编译一遍;若源文件时间早于源程序,则不需要编译。 touch
除了创建文件之外,如果touch
的文件已经存在,那么会更新文件的时间到最新。
- 使用
3. Makefile 的推导规则
- 示例代码及问题:
mycode:mycode.og++ mycode.o -o mycode -std=c++11
mycode.o:mycode.sg++ -c mycode.s -o mycode.o -std=c++11
mycode.s:mycode.ig++ -S mycode.i -o mycode.s -std=c++11
mycode.i:mycode.cppg++ -E mycode.cpp -o mycode.i -std=c++11
推导的顺序是从下到上,因为读到最下面才有源文件。但一般不建议这样写,因为把简单问题复杂化了。
- 简化写法:
mycode:mycode.cpp g++ mycode.cpp -o mycode -std=c++11
四:调试工具(gdb)
调试,在方法上有区别吗?(与windows相比)
1.调试思路上,一定是一样的
2.调试的操作方式一定是不一样的--> 命令行调试
3.在linux中,用gcc/g++生成软件时,默认是release的,所以默认gdb中无法对发布的程序进行调试,如果要进行调试,就得在编译程序时把它设置成debug模式:在编译命令后面加上 -g
gcc/g++默认行为:
1.默认是动态链接的
2.默认是release
vim默认行为:
默认打开就是命令模式
gdb相关命令
gdb 可执行程序 :打开gdb
q:退出gdb
b 行号:在这一行打断点 --- 形成编号
info b:查看所打的断点信息 --- 看到编号
info locals:查看当前栈帧局部变量的值
d 断点的编号:删除断点 ---使用编号
l 0:显示程序代码
r:调试运行 --- run ,可以在断点处停下来
n:逐过程 --- next
s:逐语句 --- step
c:运行至下一个断点处 --- continue
bt:查看调用堆栈(函数调用的过程)
finish:直接运行到将对应的函数跑完
p 变量:显示该变量
display 变量:常显示变量(相当于vs下的监视)---会出现变量编号
undisplay 编号:删除常显示的变量
set var 变量:修改变量的值
until:跳转至指定行
五.git
1.git是什么? 答:一种分布式去中心版本控制器
2.(.gitignore):凡是在这个文件内部的后缀,对应的文件不会被上传到gitee上
3.所谓的git的仓库,本质就是一个目录.git加上里面的内容 (push到远端本质就是将你的.git里面的内容同步到gitee上)
注意:在使用它之前得做一下前置的工作,需要将你的linux系统和你的gitee或者github的某一个仓库进行连接,具体可以问问ai或者搜搜教程
相关指令
git add . :将我们新增的文件(以前没有的)添加到本地的git仓库,添加到临时区域
git commit -m '这是我的第一次提交'(''里面是日志,第一次一定要写并且不能乱写):把新增的文件提交到本地仓库
git push :把本地仓库新增的内容提交到远端
git mv 原文件名 新文件名:已经提交到git的文件使用这条指令进行修改,然后再提交
git pull:把远端修改的文件拉到本地同步一下
(如果远端修改文件没有同步到本地,在本地是提交不了文件的)
在本地要同步删除远端文件的以下几步操作:
1. git rm 要删除的文件名
2. git commit -m "删除临时文件"
3. git push git log:查看git记录
4. git status:显示工作目录和暂存区的状态
总结
通过本篇文章的学习,相信大家已经了解了我们在linux操作系统中比较常用的几个开发工具,这些工具或多或少都会陪伴我们学习linux比较长的时间(除了gdb),大家尽量多熟悉熟悉。
到此篇为至,我们已经初步入门了linux操作系统的一些常见指令的使用、一些基本知识的了解,还有通过本篇文章的了解到一些常见开发工具的使用,我们接下来将会进入linux编程中各种系统理论部分的内容,这部分的内容可能稍微会比较多以及抽象,希望大家能够坚持下来(๑•̀ㅂ•́)و✧
相关文章:

Linux 基础开发工具的使用
目录 前言 一:下载工具yum 二:文本编辑器vim 1. 命令模式 2. 插入模式 3. 底行模式 三:gcc和g 基本使用格式 常用选项及作用 编译过程示例 四、Linux 项目自动化构建工具 ——make/Makefile 1. make 与 Makefile 的关系 2. Make…...
ElasticSearch查询指定时间内出现的次数/2秒内出现的次数
查询指定时间内出现的次数 POST process-log/_search {"size": 0,"query": {"bool": {"filter": [{"range": {"requestTime": {"from": 1722470400000,"to": 1722556800000}}}]}},"agg…...

华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 准备工作 2.1 注册华为云账号 2.2 确…...
STP协议:如何消除网络环路风暴
生成树协议(STP,Spanning Tree Protocol)的主要功能: 消除网络环路导致的广播风暴问题(环路会引发MAC地址表不稳定)防止网络中的主机接收重复数据帧 STP工作原理: 选举根桥(Root …...

哈工大计算机系统2025大作业——Hello的程序人生
计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算学部 学 号 2023113072 班 级 23L0513 学 生 董国帅 指 导 教 师 史先俊 计算机科学与…...
物联网常用协议Modbus、CAN、BACnet介绍
一、Modbus Modbus 作为工业通信领域的基石,是一款被广泛应用的工业通信协议,主要用于实现可编程逻辑控制器(PLC)等工业电子设备之间的连接。1979 年,Modicon 公司(现施耐德电气的一部分)开发了这一协议,旨在简化工厂内设备间的通信流程。经过多年发展,Modbus 衍生出…...

Vue中van-stepper与input值不同步问题及解决方案
一、问题描述 在使用Vant UI的van-stepper步进器组件与原生input输入框绑定同一响应式数据时,出现以下现象: 通过步进器修改值后,页面直接输出{{ count }}和watch监听器均能获取最新值但input输入框显示的数值未同步更新,仍为旧…...

react基础技术栈
react基础技术栈 react项目构建react的事件绑定React组件的响应式数据条件渲染和列表循环表单绑定 Props和组件间传值,插槽react中的样式操作 生命周期ref 和 context函数组件和hook高阶组件React性能问题React-route的三个版本react-router使用步骤react-router提供…...

Three.js搭建小米SU7三维汽车实战(4)场景搭建
场地搭建 javascript // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/addons/controls/OrbitControls.js"; // 1. 创建场景 const scene new THREE.Scene(); // 2. 创建相机 const camera ne…...
redis五种数据结构底层实现
参考文档: redis5种数据结构底层实现...

Excel 统计某个字符串在指定区域出现的次数
【本文概要】 Excel 统计某个字符串在指定区域出现的次数: 1、Excel 统计一个单元格内的某字符串的出现次数 2、Excel 统计某一列所有单元格内的某字符串的出现次数 3、Excel 统计某一区域所有单元格内的某字符串的出现次数 1、Excel 统计一个单元格内的某字符串的出…...
【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s
Kubernetes v1.24集群安装配置步骤总结 一、环境准备 (一)系统要求 运行兼容deb/rpm的Linux操作系统(如Ubuntu或CentOS)的计算机,1台或多台。每台机器内存2GB以上,内存不足会限制应用运行。控制平面节点…...
前端开源JavaScrip库
以下内容仍在持续完善中,如有遗漏或需要补充之处,欢迎在评论区指出。感谢支持,如果觉得有帮助,欢迎点赞鼓励。感谢支持 JavaScript 框架Vue.jsVue.js - 渐进式 JavaScript 框架 | Vue.jsReactReactAngularHome • AngularjQueryj…...

【Linux我做主】进度条小程序深度解析
Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行(CR/LF)的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…...
MySQL 使用全局锁会导致的问题?
MySQL 使用全局锁会导致以下核心问题: 业务停摆与主从延迟 主库备份:备份期间所有更新操作被阻塞,业务系统陷入等待状态从库备份:无法执行主库同步的 binlog,导致主从复制延迟加剧 并发性能急剧下降 …...

从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用
安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew,这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew,请先安装它。安装 Homebrew 后,安装 OpenSSL 只需要一条命令。 步骤 1:安装 Home…...
在Java对象转JSON字符串时不显示无值参数
在Java中,可以通过在展示数据的逻辑中添加判断条件来实现这一需求。以下是一些常见的场景和实现方法: 场景一:在Java对象转JSON字符串时 使用Gson库 代码实现 首先引入Gson依赖,如果使用Maven构建项目,在pom.xml文件中…...
在 Ubuntu 服务器上 下载 Clash 文件使用代理
文件Clash.Verge_1.3.8_x64_portable.zip 在 Ubuntu 服务器上不能使用这个Clash 文件**,我们需要的是 Clash.Meta 而不是 Clash Verge GUI 客户端 也就是 Clash Verge GUI 客户端的 Windows 版本,是给 Windows 桌面环境用的图形界面,不适用…...

微信小程序一次性订阅封装
封装代码如下: export async function subscribeMessage(tmplIds: string[]): Promise<ISubscribeMessagePromise> {// 模板ID// 1、获取设置状态const settings (await wx.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}console.log…...
Spring AI MCP的几个小问题
测试时间:2025/05/29 测试版本:Spring AI 1.0.0 问题1:由于启动顺序问题,MCP的服务器端和客户端不能在一个应用里,不然客户端连不上服务器会报错退出。(实际项目应该没有这样用的) 问题2:现在如果配置了…...

安全帽检测算法AI智能分析网关V4守护工地/矿山/工厂等多场景作业安全
一、方案概述 在工业生产与建筑施工场景中,安全帽是保障人员安全的重要装备。但传统人工巡检效率低、易疏漏,难以满足现代安全管理需求。AI智能分析网关V4安全帽检测方案,借助人工智能与计算机视觉技术,实现作业现场安全帽佩戴…...
Pycharm的简单介绍
目录 1. 起源与发展历史 2. 定位与核心作用 3. 主要版本 4. 应用场景 5. 核心功能与优势 6. 优缺点分析 7. 使用入门指南 8. 适用人群 9. 替代工具对比 总结 1. 起源与发展历史 公司背景:由捷克公司 JetBrains(成立于2000年)开发&a…...
重新安装解决mac vscode点击不能跳转问题
依次执行以下过程 删除vscode程序 删除vscode的缓存文件夹(xxx表示你的用户名) /Users/xxx/Library/Application Support/Code 重新安装vscode 这时候你会反向可以跳转项目内的import 文件以及自定义函数。但是import安装的包还不能点击跳转 配置python环境 如果你电脑没有安…...
Go语言中flag包的用法详解
在Go语言编程中,flag包是标准库中用于解析命令行参数的强大工具。它提供了一种简单且灵活的方式来定义和处理命令行标志(flag),使得程序能够从命令行接收用户输入的参数。本文将详细介绍flag包的用法,包括基本概念、常…...

Python自动化之selenium语句——打开、关闭浏览器和网页
目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件,输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…...

【数据结构】--二叉树--堆(上)
一、树的概念和结构 概念: 树是一种非线性的数据结构,他是由n(n>0)个有限结点组成一个具有层次关系的集合。其叫做树,是因为他倒过来看就和一棵树差不多,其实际上是根在上,树枝在下的。 树的特点: 1…...
Rust 学习笔记:使用迭代器改进 minigrep
Rust 学习笔记:使用迭代器改进 minigrep Rust 学习笔记:使用迭代器改进 minigrep不使用 clone,而使用迭代器使用迭代器适配器使代码更清晰在循环或迭代器之间进行选择 Rust 学习笔记:使用迭代器改进 minigrep 前情提要࿱…...

多线程(5)——单例模式,阻塞队列
目录 单例模式饿汉模式懒汉模式—单线程版懒汉模式—多线程版(经典面试题)懒汉模式—多线程版(改进) 阻塞队列阻塞队列是什么生产者消费者模型标准库中的阻塞队列-BlockingQueue阻塞队列实现 单例模式 单例模式是一种设计模式&am…...
React整合【ECharts】教程004:饼图的构建和基本设置
文章目录 6、饼图6.1 开启圆角环形6.2 设置扇区间隙6.3 开启深色模式6.4 开启南丁格尔玫瑰图6.5 修改数据重绘饼图6.6 完整代码下载6、饼图 6.1 开启圆角环形 1️⃣添加圆角环形开关: <div style={{marginTop:10px}}>圆角环形:<Switch checkedChildren="开启…...

视频监控汇聚平台EasyCVR工业与安全监控:防爆摄像机的安全应用与注意事项
石油、化工、煤矿等行业存在易燃易爆气体、粉尘,普通监控设备易因电火花、高温引发爆炸火灾。随着工业规模扩大,安全生产监控需求激增,防爆摄像机成为保障安全的关键。加之国家法规与行业标准对危险环境监控设备要求严格,规范其应…...