install_and_uninstall
make install, make程序会按照命令执行安装
通过make安装软件分为如下几个部分:
下载源码,github之类的
配置,通常下载的源码(tar.gz)有些配置文件,比如
configure, cmakelists.txt
等,可以传递参数来自定义安装路径和编译选项,配置好之后,运行./configure, cmake -B xxx -S xxx .
来生成makefile文件编译,执行make命令后,会读取makefile文件,根据其中的规则执行编译任务,比如可以调用gcc将源代码编译成可执行二进制文件。
安装,执行make install命令,编译好的二进制文件被复制到系统的指定位置(这个位置写在makefile中的),通是/usr/local/bin
、
/usr/local/lib卸载,执行make uninstall命令,按照预定义的规则将安装的文件删除。
通过make安装的软件,
- 不会自动检测依赖,必须保证所有的依赖库已经正确安装
- 升级复杂,无法处理残留文件和依赖关系
- 文件分散,难以追踪,尤其是没有make uninstall
如果在makefile文件写有install,那么执行make install, make程序会按照写的命令进行安装
如果在makefile文件写有uninstall,那么执行make uninstall, make程序会按照写的命令进行卸载,没写,也可以自动查找安装的文件并删除。
使用
make
安装和卸载软件的本质是手动编译源代码并将生成的二进制文件和相关资源安装到系统中。它缺乏像 APT 这样的包管理工具的自动化和依赖管理功能,因此需要用户手动管理依赖项和文件。相比包管理器安装,make
安装提供了更多的灵活性和自定义选项,但也增加了管理的复杂性。
通过APT(Advanced Packaging Tool)安装软件
可以看作dpkg的前端。
历史
最初的GNU/linux系统通过提供tar.gz
源码给用户自行安装,这就如上一章节所讲的,软件管理太麻烦。所以Debian就做了dpkg这个工具来安装.deb
软件包,又做了apt这个工具来处理依赖。
dpkg 完成底层操作:处理本地deb包,不解析依赖,一般用户不用这个工具
apt 完成上层操作:从远程仓库下载包,自动解析依赖,借助dpkg完成安装,用户友好,经常用。
原理
服务器会分析自己的所有的deb包,并根据依赖生成一个索引文件,用户可以使用apt update
来下载最新的索引文件。用户通过apt
安装软件时,apt
就会去本地索引文件查找依赖,再从服务器上下载到本地,按照依赖顺序安装。每次安装前都建议更新索引。
服务器
服务器的地址被存储到/etc/apt/sources.list
文件和/etc/apt/sources.list.d
文件夹下的文件中,
一般格式是 deb + URL + 代号(focal,jammy等)+软件包分类(main, restricted, universe)
可以将源直接存到/etc/apt/sources.list
文件中,也可放到/etc/apt/sources.list.d
文件夹下,这样删除源时,直接删除list文件就行了。
每次通过apt更新索引时,就会去上述.list文件找服务器,再去服务器下载索引。
使用
apt和apt-get都差不多,apt命令有进度条。
- update, 更新索引
1 | sudo apt update |
- upgrade 升级所有软件
- install 安装软件
1 | apt install 包名1 包名2 |
- remove 删除软件
1 | apt remove 包名1 包名2 #也可以加个 --purge参数卸载干净点 |
- autoremove。remove不会主动卸载依赖,autoremove会自动卸载不被依赖的软件包。
1 | apt autoremove [包名] |
- 下面是不常用的命令
- full-upgrade, 先删除再升级
- list。查看可用包、已安装包、可升级包。比如
1 | apt list --installed |
- show 可以输入关键信息,查看相关的包
1 | apt search sl |
- 指定版本,可以使用
包名·+版本
的形式来指定版本
1 | apt install python=3.8 |
- 使用clean清理下载完的.deb包
- apt source 包名,下载包的源码
1 | apt source sl |
- 修复安装
1 | apt -f install |
- 查看依赖
1 | apt-cache depends 包名 |
Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH的区别_path library-CSDN博客