什么是二进制包?
在Linux上安装程序通常与在Windows上传统的安装软件方式有所不同。而不是从供应商的网站上下载安装程序,文件来自于一个程序仓库,通常根据你的Linux发行版进行定制。你可以使用Linux软件包管理器或应用商店访问这个仓库。
这些仓库中的程序由多个文件组成,并以一个归档格式进行打包,以便于访问和分发。例如,Debian使用DEB格式存储和分发程序。这些打包文件被称为二进制包。
如何阅读二进制代码
你需要一个特殊的程序来提取这些文件并将其安装到计算机上,通常是你的软件包管理器或应用商店。这些工具还具有其他有用的功能,例如跟踪已安装的文件和管理软件更新。
较新的软件包格式,如Flatpak和Snap,适用于不同版本的Linux,但它们仍然由预编译的二进制程序组成。两者都需要图形化的应用商店或基于命令行的软件包管理器进行安装。
什么是源代码?
所有软件都由称为源代码的文本行组成,用特定的编程语言编写,例如C或C++。通常情况下,你不能只将这些源代码打包成一个存档文件并称之为软件包。这些行需要被转换为计算机可以理解和执行的语言。
这个过程被称为编译,最终的结果是创建出计算机可以运行的二进制文件。软件包和软件的区别在于,软件的二进制文件与其他文件(如配置文件)一起存储在一个包中。
什么是“从源代码安装”?
从源代码安装程序意味着不使用软件包管理器进行安装。你需要编译源代码,并将二进制文件复制到计算机上。
大多数情况下,你可以从诸如GitHub、GitLab或Bitbucket等托管服务上下载项目的源代码。较大的程序甚至可能在个人网站上托管源代码。该代码通常以一个归档格式(也称为源代码包)进行压缩。
一组特殊的工具帮助自动化构建过程。在Linux桌面上,通常以一个名为make的命令行程序的形式存在。用不同语言编写的源代码需要特定的编译器和命令将其转换为二进制文件。make程序自动化了这个过程。
为了使这个自动化工作起来,程序提供了一个名为Makefile的文件,告诉make应该做什么和如何编译。如今,Makefile通常由特殊的软件(如CMake)自动生成。这就是你需要介入的地方。从这里开始,你可以指定想要编译到软件中的具体功能。
从源代码构建的示例
例如,下面的命令使用CMake为Calligra办公套件生成一个配置文件。创建的文件告诉make程序只编译Calligra的Writer组件。
cmake -DPRODUCTSET=WORDS -DCMAKE_INSTALL_PREFIX=$HOME/kde/inst5 $HOME/kde/src/calligra
完成这一步骤后,用户只需运行make工具来编译并将结果复制到他们的计算机上。操作步骤如下:
make
make install
虽然这是编译程序的一般模式,但还有许多其他安装源代码包的方法。例如,Gentoo Linux内置了一种处理源代码包的方法,使得该过程更快捷、更简便。但是构建二进制包需要比上述命令更多的步骤。
使用二进制包的好处
如果你使用Linux,很可能有人预编译了你已安装的软件。这比使用源代码包更为常见。但是为什么会这样呢?
1.二进制版本更易管理
二进制包不仅包含已编译的安装文件,还存储了其他信息,使得你的包管理器能够轻松跟踪所有程序。例如,DEB文件(Debian及其衍生版的包格式)还包含重要信息,如程序运行所需的其他软件以及当前版本。
这使得安装包变得更加简单,因为你不需要担心需要哪些其他文件才能成功运行程序。你的包管理器可以从包本身读取这些信息,并自动下载所有必要的依赖项。
而当从源代码安装程序时,除非将代码编译为独立的二进制包,否则你将需要负责管理该软件。你需要记住你需要哪些其他程序来使其工作,并自行安装它们。
2.二进制版本具有更好的稳定性
负责维护包管理器仓库的人员往往会对二进制文件进行测试,并尽力修复出现的问题。这可能导致提高稳定性,因为包维护人员可能会发现安装源代码的人可能忽视的问题。
此外,包通常必须遵守一套严格的规则,以确保它们能在你的系统上运行。例如,Debian和Ubuntu都有一个政策手册,许多其他Linux发行版也有类似的手册。
有些程序还依赖于不同版本的同一软件依赖项来运行。软件包仓库会尽力解决这些冲突,以免给你带来麻烦。
编译源代码包的好处
从源代码安装程序并不是每个人都需要做的事情,因为如果坚持使用二进制包,通常更容易维护你的计算机。尽管如此,使用这种稍微复杂一些的方式安装程序仍然有一些优势。
1.源代码提供最新软件
使程序更加可靠的一个缺点是需要时间来改进和修复。有时候可能有可用的二进制文件,但源代码会稍后提供。对于希望拥有最新和最好的软件的人来说,他们可能愿意在交换较新软件的同时稍微牺牲一些稳定性。
虽然有一些Linux操作系统可以满足这种需求而无需编译程序,但它们也有一些缺点。例如,那些不经常发布固定软件包版本的软件在存储库中难以保持最新。相比之下,从源代码安装则不受这些限制。
这是因为二进制包通常是根据官方发布的程序版本制作的。因此,这些版本之间的更改通常不会被考虑在内。通过从源代码编译自己的软件,你可以立即从这些更改中受益。
也有可能你的Linux操作系统没有预先为你准备好你想要的软件。过去,这将使得从源代码安装是唯一的选择。通用的软件包格式已经改变了这一点。Flatpak和Snap软件包通常也比系统存储库更快地接收更新。但仍然有时候编译是获得所需软件的唯一途径。
2.你可以自己选择功能
FFmpeg的功能 使用源代码包的另一个好处是你可以更加掌控你安装的程序。当从二进制软件库安装时,你在自定义软件包方面受到限制。
以FFmpeg为例,它是一个基于命令行的音视频转换工具。默认情况下,它带有大量的功能,其中一些你可能从未使用过。例如,FFmpeg支持JACK音频,尽管这个软件通常只在生产环境中使用。
通过编译FFmpeg,你可以移除你不需要的功能,使其更加轻巧并符合你的需求。同样的原理也适用于其他庞大的程序。
当资源有限时,移除功能可以有效减轻负荷。难怪许多低端计算机上都使用基于Gentoo Linux的ChromeOS。Gentoo是基于源代码的,它编译了许多软件,潜在地使这些系统运行得更加轻巧。
为什么不同时使用二进制和源代码包呢?
虽然你可能不会每天都想编译软件包,但这是一种有用的方法。尽管如此,随着从Snap Store和Flathub等网站提供的新的通用软件包格式,你更不太可能需要从源代码构建以获得最新的软件。