Linux 开发工具的魔力:如何提升你的开发速度 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!
👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对Linux OS感兴趣的朋友,让我们一起进步!
引言 在现代的操作系统中,软件包是将应用程序、工具、库文件及其依赖项打包成一个独立单元的重要手段。它为开发人员、系统管理员和终端用户提供了简化安装、管理和升级软件的方式,尤其在 Linux 环境下,软件包是保证系统稳定性和高效性的关键组成部分。
一. \color{RedOrange}软件包管理器 1.1 \color{Purple}什么是软件包 在 Linux 中,软件包是指已经打包好的软件应用程序或库文件,通常包含了该软件的源代码、可执行文件、依赖库、配置文件等,目的是方便在 Linux 系统上进行安装、更新和卸载。
1.2 \color{Purple}Linux安装软件方法 源代码安装 rpm包安装 包管理器安装(yum/apt) Centos环境使用前者,Ubuntu使用后者 rpm包安装问题:
RPM 是一种强大的软件包管理工具,并且与许多 Linux 发行版(尤其是 Red Hat 系列)紧密集成,但它也存在一些局限性,特别是在依赖管理、软件源管理和更新等方面。为了弥补这些不足,用户通常会依赖像 YUM、DNF 等工具,这些工具在后台使用 RPM 但提供了更丰富的功能,如自动依赖解决、仓库管理、自动更新等。因此,虽然 RPM 本身是有效的安装工具,配合高级包管理器的使用,能够极大提升用户体验。
前面两种安装方法麻烦且很繁琐,问题多。所以小编很不推荐。
\color{Yellow}本篇文章将详细介绍如何在Ubuntu环境下安装软件 二. \color{RedOrange}APT具体操作 2.1 \color{Purple}查看软件包 命令格式:
apt search 软件包
功能
在仓库中搜索与关键字匹配的软件包,提供包名称和简短描述,帮助你快速找到相关软件包。 示例:
apt search lrzsz
输出内容:命令会列出所有匹配的包及其简短描述。例如:
Sorting… Done
Full Text Search… Done
cutecom/focal 0.30.3-1build1 amd64
Graphical serial terminal, like minicom
lrzsz/focal,now 0.12.21-10 amd64 installed
Tools for zmodem/xmodem/ymodem file transfer
简单说明
如果该包已安装,会标明 installed。 如果该包是自动安装的依赖包,可能会显示 automatic。 2.2 \color{Purple}安装软件 命令格式
sudo apt install -y 软件包
root用户不需要sudo提权,而普通用户需要提权 使用sudo提权
示例:
sudo apt install -y lrzsz
2.3 \color{Purple}卸载软件 命令格式:
sudo apt install -y 软件包
示例:
sudo apt install -y lrzsz
apt remove -y lrzsz 是用于在基于 Debian 的系统中卸载 lrzsz 软件包的命令,并通过 -y 自动确认删除操作。它删除了软件包的二进制和库文件,但保留配置文件。如果你不再需要这个软件并且想完全清除它,可以使用 apt purge。 2.4 \color{Purple}安装源 cat /etc/apt/sources.list
通过 cat /etc/apt/sources.list 命令,你可以查看当前系统中 APT
使用的所有软件源,这对于排查软件包下载问题、修改仓库源或切换到其他镜像源等操作非常有用。 三. \color{RedOrange}vim编辑器 Vim 是一款高度可定制化、功能强大的文本编辑器,它源自于 Vi 编辑器,并在其基础上进行扩展和改进。Vim 的设计目标是为程序员提供一个高效的编辑环境,同时支持多种编程语言和文件格式的处理。
3.1 \color{Purple}Vim 编辑器的背景 起源:Vim 是由 Bram Moolenaar 在 1991 年开发的。它是从 Vi 编辑器派生而来的,Vi 编辑器最初由 Bill Joy 在 1976 年开发,并在 Unix 系统中成为标准文本编辑器之一。 Vim 的命名:Vim 的名字来源于 “Vi IMproved”(Vi 改进版),表示它在 Vi
的基础上做了许多增强和改进,例如支持多级撤销、语法高亮、插件扩展等。 跨平台性:Vim 目前已支持多种操作系统,包括 Linux、Windows、macOS 等,这使得它在开发者社区中非常受欢迎。 目标用户:Vim 主要面向开发者,尤其是那些需要频繁编辑代码和处理文本的程序员。由于它的强大功能和高效的键盘操作,Vim被认为是一款适合于高度熟练用户的编辑器。 3.2 \color{Purple}vim基本概念 3.2.1 vim常用三种模式 vim具有很多种模式,掌握三种模式即可。
命令模式(commandmode):命令模式是 Vim 启动后的默认模式,在该模式下,所有按键的输入都是用来执行编辑命令,而不是直接输入字符。用户在命令模式下可以进行各种文本操作,如移动光标、删除文本、复制粘贴等。
插⼊模式(Insert mode):插入模式是用于直接输入文本的模式。在插入模式下,Vim 会像传统的文本编辑器一样接收字符输入。你可以在插入模式下输入内容,修改文本。
底⾏模式(last line mode):末行模式是用于执行更复杂命令的模式,如保存文件、退出 Vim、查找替换等。在末行模式下,用户可以输入类似于命令行的命令。这些命令通常以冒号 : 开头,并在屏幕的底部显示。
3.3 \color{Purple}vim编辑器基本操作 三种模式下如何正确快速切换(如下图)
友情提醒:进入vim编辑器后,默认处于命令模式,你可以通过输入上图中的字符切换到你需要进入的模式中。 退出vim技巧:在命令模式下,按下 : 进入底行模式
w:保存当前文件 wq :存盘并退出vim q!: 不存盘强制退出vim 3.3.1 正常模式下命令集 移动光标
h :光标向左移动一格 j :光标向下移动一格 k :光标向上移动一格 l :光标向右移动一格 G :移动到文章最后 $ :移动到光标所在行尾 ^ :移动到光标所在行首 w :光标跳转到下个字的开头 e : 光标跳到下个字的字尾 b : 光标回到上个字的开头 #l : 光标移到该⾏的第#个位置 gg : 光标跳转至文本开始 shift + g : 光标跳转至文本末端 shift + b : 屏幕往“后”移动⼀⻚ shift + f : 屏幕往“前”移动⼀⻚ shift + u : 屏幕往“后”移动半⻚ shift + d : 屏幕往“前”移动半⻚ 删除文字操作
x : 每按一次,将会删除光标所在位置的一个字符 #x : 表⽰删除光标所在位置的“后⾯(包含⾃⼰在内)”x个字符 X : ⼤写的X,每按⼀次,删除光标所在位置的“前⾯”⼀个字符 #X : 表⽰删除光标所在位置的“前⾯”x个字符 dd : 删除光标所在行 #dd : 从光标所在⾏从上往下开始删除#⾏ 复制:(下面的命令都可以接受后面的操作行为 ->
\color{Red}如果你想粘贴复制的单词,可以按 p 来粘贴。 )
注意:p: 将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。 yw :复制当前光标所在位置的一个单词,并将其存入寄存器中。 #yw : 复制当前光标所在位置的#个单词,并将其存入寄存器中。 yy : 复制光标所在⾏到缓冲区。 #yy : 复制光标当前所在⾏从上往下数#行到缓冲区。 替换:
r :替换光标所在处的字符。(这个字符需要你从键盘中输入) R : 一直替换光标所指处的字符,直至用户者按下Esc键,即可退出。 撤销离本次最近的一次操作(可循环撤销,最近也是变动的)
u : 撤销上次的操作 Ctrl + r : 用于 重做(redo)你之前的撤销操作。也就是说,它会恢复你用 u(撤销)撤回的上一个操作。 更改
cw : 删除光标所在位置的单词(从前往后扫描的)并进入插入模式,允许你直接重新输入该单词。 c#w : 更改指定#个字符。 跳⾄指定的⾏
Ctrl + g : 快速查看光标的位置信息或显示文件信息。 #G : 光标跳转到指定#行行首。 3.3.2 末行模式下命令集 在使⽤末⾏模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进⼊末⾏模式。 列出⾏号
set nu : 会在每一行的前面显示行号,通常这是一个非常有用的功能,尤其是在编程或编辑大文件时,行号能帮助快速定位内容。 跳转至文件指定行
查找字符
/关键字 : 先按「/」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往 \color{Red}后 寻找到您要的关键字为⽌。
「?关键字」:先按「?」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往 \color{Red}前 寻找到您要的关键字为⽌。
保存文件
w : 在冒号输⼊字⺟「w」再按回车就可以将⽂件保存起来。 退出vim
wq : 保存并退出vim编辑器。 q! : 不保存并强制退出vim编辑器。 非常实用的指令操作
批量化注释: Ctrl +v -> hjkl ->shift + i = I ->// -> Esc 批量化去注释 Ctrl + v -> hjkl -> d vim 文件名 + 数字x -> 光标进入指定x行数 !g/!l : 执行最近与!后面(第一个字母相同即可,其它可不同)字符匹配指令 %s/printf/print/g 命令在 Vim 中表示将文件中所有的 printf 替换为 print,并且替换是全局的,即每一行的所有 printf 都会被替换。 Ctrl + ww : 底行模式下进行分屏模式,同时可以任意回到任意分屏 补充:vim一共有12种模式
打开,关闭,查看,查询,插⼊,删除,替换,撤销,复制等操作。
四. \color{RedOrange}gcc/g++编译器 \color{Purple}4.1 编译与汇编 本篇博客详细解释过,不再叙述;
传送门:编译与链接
\color{Purple}4.2 编译选项 命令格式:
gcc 选项 要编译的⽂件 选项
4.2.1 编译过程详解 预处理(Preprocessing):
作用:处理源代码中的 宏定义、头文件包含、条件编译 等指令。 过程:通过处理 #define、#include、#if 等预处理指令,预处理器会生成一个没有宏和头文件指令的源代码文件。 结果:输出一个经过处理的纯源代码文件,准备进入编译阶段。 命令格式:
注:这里后面 -o 目的是方便查看过程,不加 -o 则会将处理的结果打印至显示器文件。
\color{Red}后面的处理过程都是一样的,不再重复强调 编译(Compilation):
作用:将预处理后的源代码转换为 汇编语言。 过程:编译器分析源代码,进行 语法分析,生成 中间表示(如抽象语法树),然后将其转化为目标语言(通常是汇编代码)。 结果:生成一个与平台相关的汇编文件,包含程序的机器指令。 命令格式:
gcc -S 预处理形成文件.i -o 目标文件.s 汇编(Assembly):
作用:将汇编代码转化为 机器代码。 过程:汇编器将生成的汇编语言代码翻译成目标平台的机器指令,通常生成 目标文件(.o 或 .obj)。 结果:生成一个机器代码文件(目标文件),这时的代码还不能独立运行。 命令格式:
gcc -c 编译形成的.s为后缀的临时文件 -o 目标文件.o 注意:这里形成的以.o为后缀的文件,是可重定位目标二进制文件,无法执行。
链接(Linking):
作用:将一个或多个目标文件和库文件合并成一个 可执行文件。 过程:链接器将目标文件中的符号和地址进行解析,并将外部引用(如库函数、全局变量等)链接到相应的内存地址。 结果:生成最终的 可执行文件,可以运行在操作系统上。 命令格式:
问题1:问什么要编译和汇编:
减少开发的成本
\color{Purple}4.3 动态链接和静态链接 4.3.1 静态库(Static Library) 静态库是一个包含了已编译代码的文件,通常是 .a(在 Linux 系统上)或 .lib(在 Windows 系统上)格式。
静态库在编译时被链接到最终的可执行文件中。编译器会将静态库的代码直接嵌入到应用程序中。
一旦编译完成,不需要依赖外部库文件,所有依赖都已经包含在可执行文件中。
运行时不需要加载外部库,启动速度可能更快。
文件大小较大,因为包含了所有依赖的代码。
如果库代码更新,必须重新编译应用程序。
不支持共享内存。
命令格式:
gcc 文件名.o -o 目标文件 -static
4.3.2 动态库(Dynamic Library) 动态库是一个独立的代码库,通常是 .so(在 Linux 上)或 .dll(在 Windows
上)格式。它包含了可以在运行时被程序加载和执行的代码。
动态库在编译时并不直接链接到应用程序中,而是通过链接器使用符号(也称为地址)引用。程序在运行时需要动态加载这些库。
1 |可以共享内存,多个程序可以加载同一个动态库,这样可以节省系统资源。
2 | 如果库代码更新,程序不需要重新编译,只需要更新库文件即可。
3 | 可通过动态加载和卸载库来实现模块化功能。
1 | 程序启动时需要加载库,可能影响启动速度。
2 | 如果动态库缺失或版本不兼容,可能导致程序无法启动或崩溃。
补充一个命令ldd :是一个在 Linux 系统中用来显示一个可执行文件或共享库所依赖的共享库(动态库)列表的命令。它可以帮助你查看一个程序或库在运行时需要加载哪些共享库,并且展示每个库的实际位置。 命令格式:ldd executable-file
其中 executable-file 可以是一个可执行文件或者一个共享库文件。ldd 会列出该文件所依赖的所有共享库以及它们的路径。
示例:
ldd mycode
输出
linux-vdso.so.1 (0x00007ffc78fbd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f21a35bd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f21a37bf000)
说明:
linux-vdso.so.1是 Linux 内核提供的虚拟动态共享对象(Virtual Dynamic Shared Object),它通常不需要物理文件,表示内核所提供的动态库接口。 libc.so.6是该程序所依赖的动态库。=> 后面的路径是实际的文件路径 /lib64/ld-linux-x86-64.so.2 是程序加载时的动态链接器,它负责加载其它共享库。 5. \color{RedOrange}最后 本文介绍了 Linux 开发工具的基本概念及其使用方法,重点讲解了软件包管理器、APT 操作、Vim 编辑器、以及 GCC/G++ 编译器的使用。
首先,介绍了 Linux 中的软件包管理器,强调了使用 APT 进行软件包安装、卸载和源管理的操作。然后,详细阐述了 Vim 编辑器的基本操作、常用模式、以及高效的文本编辑技巧。接着,讲解了 GCC/G++ 编译器的编译与汇编过程,包括静态链接和动态链接的区别及各自的优缺点。最后,介绍了 ldd 命令,帮助开发者查看程序依赖的动态库。
路虽远,行则将至;事虽难,做则必成