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

【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用

文章目录

  • 1.软件包管理器yum
  • 2.Linux编辑器vim
    • 2.1 三模式切换
    • 2.2 正常模式
    • 2.3 底行模式
    • 2.4 可视化模式
    • 2.5 vim 配置
  • 3.Linux编译器gcc/g++
    • 3.1 预处理
    • 3.2 编译
    • 3.3 汇编
    • 3.4 连接
    • 3.5 函数库
  • 4.Linux自动化构建工具Makefile
  • 5.Linux调试器gdb
  • 希望读者们多多三连支持
  • 小编会继续更新
  • 你们的鼓励就是我前进的动力!

本文将介绍关于 Linux 系统常用的工具包,便于后续的代码操作

1.软件包管理器yum

对于 Linux 系统来说,下载软件是必不可少的,就像平常使用手机下载软件一样满足我们的日常需求,一般 Linux 有三种下载方式:

  • 源代码下载: 从官网下载代码自行配置,虽说可以充分利用代码自行调配,但是上手使用难度太高
  • rpm下载: 使用命令获取文件安装,但是会涉及该安装包依赖于其他安装包等问题,需要手动解决,过程繁琐
  • yum下载: 也是使用命令获取文件安装,能够自动分析软件包的依赖关系,并从 yum 源中下载并安装所需的依赖包,大大简化了软件安装过程,虽说安装的版本可能不是最新的,但是简单易上手,通常来说是够用的

因此我们主要使用 yum

🤔那么yum是如何下载的呢?

其实也没那么复杂,就拿手机来举例,跟 Linux 系统一样都叫做客户端,yum 就相当于是手机里的应用市场,是一个软件的仓库地址,告诉 yum 去哪里找软件,然后通过网络在服务器里找到对应的软件源来下载软件包,软件源又分为官方和第三方的


通常我们通过 yum list 查看可安装软件列表,或者 yum search 软件名 进行软件搜索

以rz、sz命令的下载为例

[zzh_test@hcss-ecs-6aa4 ~]$ yum list | grep rzsz
lrzsz.x86_64                             0.12.20-36.el7                @base    

我们查询到该命令的安装包为 lrzsz

yum install -y 软件包名

下载的命令通常如上所示,-y 表示省略输入是否同意安装的步骤

在这里插入图片描述

对于该红框的信息可以解释为:

软件包名称: 主版本号,次版本号,源程序发行号-软件包的发行号,主机平台,cpu架构

x86_64 后缀表示 64 位系统的安装包,i686 后缀表示 32 位系统安装包,选择包时要和系统匹配,el7 表示操作系统发行版的版本,el7 表示的是 centos7/redhat7el6 表示 centos6/redhat6,最后一列,base 表示的是 “软件源” 的名称,类似于 “小米应用商店”,“华为应用商店” 这样的概念

顺便一提,rz 命令用于从 Windows 上传文件到 Linuxsz 命令用于从 Linux 下载文件到 Windows,输入命令后会弹出文件选择对话框,选择要上传的文件即可,在本地直接拖动文件到窗口也是一样的

yum remove 软件包名

想要删除可以输入以上命令

🔥值得注意的是:

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

2.Linux编辑器vim

在这里插入图片描述

vim 文件名 进入编辑界面,可以理解为记事本,初始状态下是命令模式

2.1 三模式切换

在这里插入图片描述
通常最常用的三个模式:

  • 命令模式: i 切换到插入模式,:(shift + ;) 切换到底行模式
  • 插入模式: esc 回到命令模式
  • 底行模式: esc 回到命令模式

命令模式就是使用命令控制屏幕光标的移动,字符、字或行的删除,一般不做文本输入;插入模式就是允许编辑的模式,是我们后面用的最频繁的编辑模式;底行模式用于文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作

2.2 正常模式

正常模式就是命令模式,通常使用命令进行一些简单的操作

移动:

  • gg:定位光标到开头行第一位
  • G(shift + g):定位到结尾行第一位
  • n + shift + g :定位到第 n 行文本第一位
  • $(shift + 4):定位到当前行的文本最后一位
  • ^(shift + 6):定位到当前行的文本第一位
  • w、b:光标按照单词进行行内、跨行移动
  • h、j、k、l:左下上右移动光标

复制粘贴:

  • (n)yy:复制光标所在(n)行
  • (n)dd:删除(n)行
  • (n)p:粘贴 n
  • u:撤回
  • ctrl + r:撤回之前的撤回

转换:

  • ~:大小写转换
  • (n)r:对光标字符之后的所有字符进行批量化替换
  • R(shirf + r):进入替换模式,对内容整体替换
  • (n)x:对光标字符之后的字符进行删除

2.3 底行模式

在使用底行模式之前,请记住先按 esc 键确定您已经处于正常模式,再按 : 冒号即可进入底行模式

跳到文件中的某一行:

  • ## 号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字 15,再回车,就会跳到文章的第15行

查找字符:

  • / + 关键字:先按 / 键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 n 会往后寻找到您要的关键字为止,从当前光标位置向下(往后) 查找

  • ? + 关键字:先按 ? 键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 n 会往前寻找到您要的关键字为止,从当前光标位置向上(往前) 查找

保存文件:

  • w:在冒号输入字母 w 就可以将文件保存起来离开 vim
  • q:按 q 就是退出,如果无法离开 vim,可以在 q 后跟一个 ! 强制离开 vim
  • wq:一般建议离开时,搭配 w 一起使用,这样在退出的时候还可以保存文件

2.4 可视化模式

可视化模式一般用于批量操作,比如批量加注释:

批量注释:

在正常模式下按 ctrl + v ,进入 V-BLOCK 模式,按 J 键 或 K 键选择要注释的内容,J 向上 K 向下,按住 shift + i 进入插入模式,输入 //,点击 esc 键,完成注释

批量取消注释:

在正常模式下按 ctrl + v ,进入 V-BLOCK 模式,然后按两下 L 键(右移两格),选中注释的符号,按 J 键或 K 键选择要取消注释的内容,按 d 键完成批量取消注释

2.5 vim 配置

vim 可以通过在自己用户下添加 .vimrc 的文件进行功能、风格等配置,为了能够像在VS
、IDEA中那样使用方便,可以自行上网进行配置搜索,这里我推荐一个配置项目

传送门:VimForCpp

3.Linux编译器gcc/g++

gcc/g++ [选项] 要编译的文件 [选项] [目标文件]

gcc/g++ 是一款语言编译器,相当于 Linux 系统的 VSgcc 专门编译 C 语言,g++ 既可以编译 C 语言,也可以编译 C++

生成可执行文件直接 ./目标文件 执行即可

3.1 预处理

[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar.c  processBar.h
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc -E processBar.c -o processBar.i
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar.c  processBar.h  processBar.i

预处理功能主要包括宏定义,文件包含,条件编译,去注释等

-E 表示让 gcc 在预处理结束后停止编译过程,-o 后面一定是接目标文件,源头文件放哪儿无所谓

3.2 编译

[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar.c  processBar.h  processBar.i
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc -S processBar.i -o processBar.s
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar  processBar.c  processBar.h  processBar.i  processBar.s

编译主要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后, gcc 把代码翻译成汇编语言

-S 表示让 gcc 在编译结束后停止编译过程,生成汇编代码

3.3 汇编

[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar  processBar.c  processBar.h  processBar.i  processBar.s
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc -c processBar.s -o processBar.o
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar.c  processBar.h  processBar.i  processBar.o  processBar.s

汇编主要生成机器可识别代码

-c 表示让 gcc 在汇编结束后停止编译过程,生成二进制代码

3.4 连接

[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar.c  processBar.h  processBar.i  processBar.o  processBar.s
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc processBar.o -o processBar
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar  processBar.c  processBar.h  processBar.i  processBar.o  processBar.s

连接表示连接函数库生成可执行文件

3.5 函数库

函数库分为两种类型的库:

静态库:

静态库就是将需要展开的函数在函数定义的地方直接展开,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了,其后缀名一般为 .a

动态库:

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。所以动态库也叫共享库,动态库一般后缀名为 .so,如前面所述的 libc.so.6 就是动态库,gcc 在编译时默认使用动态库

4.Linux自动化构建工具Makefile

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

通常我们需要不断的进行 gcc / g++ 编译、rm 删除执行文件等等指令,如果有大量文件需要多次重复以上操作的话,那么每次都手动输入一大长串必然是麻烦的,因此就需要编写 Makefilemakefile 也行,大小写无所谓)文件自动化使用指令

在这里插入图片描述

如图所示可解释为:

processBar 可执行文件依赖于 processBar.c、main.c$^ 表示 : 后面的文件,$@ 表示 : 前面的文件,直接写文件名也可以,不过用符号比较方便就是了,下面的 clean 同理,: 后面是空的表示不依赖于任何文件就可以执行

[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar.c  processBar.h[zzh_test@hcss-ecs-6aa4 progressbar]$ make processBar
gcc processBar.c main.c -o processBar 
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar  processBar.c  processBar.h[zzh_test@hcss-ecs-6aa4 progressbar]$ make clean
rm -rf processBar
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c  makefile  processBar.c  processBar.h

通常使用 make+冒号前的依赖名 的方式执行自动化,如果只输入 make 指令的话默认执行第一条自动化指令,被依赖的文件总会更新,所以要多次执行 make processBar 的指令

make 的默认行为是:基于时间戳判断更新,检查目标是否是一个已存在的文件,如果文件存在且没有更新(即依赖项未变化),则跳过该目标的命令。像 clean 这种没有具体依赖目标的叫做 伪目标

但有些场景下,目标并不是实际文件(比如常见的 cleanallinstall 等),若目录中恰好有与这些目标同名的文件(比如名为 clean 的文件),make 会误将其当作 “已完成的目标文件”,认为无需执行,从而跳过本应运行的命令(如 rm -f *.o),导致清理、构建等预期操作失败

因此需要用 .PHONY 声明伪目标 —— 强制 make 忽略同名文件,始终执行命令

🔥值得注意的是:

hello:hello.o 
gcc hello.o -o hello hello.o:hello.s 
gcc -c hello.s -o hello.o hello.s:hello.i 
gcc -S hello.i -o hello.s hello.i:hello.c 
gcc -E hello.c -o hello.i

make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件,在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不理,make 只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦

5.Linux调试器gdb

Linux 系统中,程序的发布默认是 release 版本,无法直接发布,所以调试的前提是处于 debug 版本,那么在 gcc / g++ 编译时要加上 -g 使文件以 debug 版本输出

gdb 是用来调试可执行文件或者目标文件的,所以用 gdb 目标文件 指令启动调试器

以下是 gdb 代码调试时的指令

在这里插入图片描述
一般我们还是在 VS 里调试比较方便,因此 gdb 的调试就不过多叙述


希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!

请添加图片描述

http://www.xdnf.cn/news/1205713.html

相关文章:

  • GoLand 项目从 0 到 1:第三天 —— 图数据库版本管理方案调研与中间件部署
  • Dify-14: 工作流API端点
  • 在虚拟机ubuntu上修改framebuffer桌面不能显示图像
  • STM32F4—电源管理器
  • YOLOv11改进:添加SCConv空间和通道重构卷积二次创新C3k2
  • 时间数字转换器TDC的FPGA方案及核心代码
  • 数分思维10:用户增长
  • 小智源码分析——音频部分(二)
  • 机器学习sklearn:决策树的参数、属性、接口
  • mp核心功能
  • S7-200 SMART 通过本体 RS485 口与 DP01 上传 / 下载程序(网口故障)
  • Java项目:基于SSM框架实现的进销存管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 我从 Web2 转型到 Web3 的 9 条经验总结
  • 架构实战——互联网架构模板(“存储层”技术)
  • fchown/fchownat系统调用及示例
  • 坚鹏:AI智能体培训是知行学成为AI智能体创新应用引领者的基础
  • 3DGRUT: 革命性的3D高斯粒子光线追踪与混合光栅化技术深度解析
  • Item18:让接口容易被正确使用,不易被误用
  • 鱼皮项目简易版 RPC 框架开发(二)
  • JavaScript:10个数组方法/属性
  • ROS2入门之开发环境搭建
  • 【C++】手搓一个STL风格的vector容器
  • vue如何在data里使用this
  • 屏幕晃动机cad【4张】三维图+设计说明书
  • Java面试宝典:MySQL8新特性
  • 软工八将:软件开发全流程核心角色体系解析
  • kubectl中的yaml配置详解
  • 【Unity游戏】——1.俄罗斯方块
  • 【大模型LLM】梯度累积(Gradient Accumulation)原理详解
  • 软件设计师-知识点记录