![二进制文件和库有什么区别?](https://linux22.com/image/117559/%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E5%92%8C%E5%BA%93%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我正在尝试了解文件系统层次结构标准。我已经查找了二进制文件和库,据我目前的理解:
二进制文件是二进制格式的计算机可读代码文件,直接用位控制 CPU 和处理器。
图书馆是各种程序可以使用的函数,为了方便起见 - 就像当您需要 PHP 的 Javascript 中的模块时一样。
这种理解正确吗?如果是,为什么我们仍然将库和二进制文件分开?一些图书馆是二进制文件,对吗?一些二进制文件(cat、less、date、rm、cp 等)被使用和重用,就像它们是库一样......有人可以帮助解释其中的区别并帮助我找到这两个词的更好定义吗?谢谢。
答案1
您的理解大部分是正确的,但还有一些额外的事情需要考虑:
- “二进制”指的是人类不可读的东西。这通常指的是机器代码,但从这个意义上讲,许多其他文件也是二进制文件,大多数多媒体格式就是一个很好的例子。然而,FHS 对于该术语有更具体的用法。
- 库可以是二进制代码。事实上,其中的大部分内容
/lib
都是编译为机器代码的库。 - 虽然类似的东西
cat
在 shell 脚本中使用,例如调用库中的代码,但它们不是 FHS 意义上的库,因为它们可以自行运行。
由于这些观点,不编写标准文档的人中更常见的术语是:
目标文件:这些是本机编译的机器代码,但甚至可能无法运行或不可调用。它们通常有一个
.o
扩展,除非它们属于其他类别之一,并且除了构建软件时之外,在大多数系统上几乎从未见过。我将它们列在这里是因为它们对于理解下面的一些事情很重要。可执行文件:这些文件主要由可直接运行的自包含代码组成。它们可能是特殊格式的目标文件,可以直接由内核加载(例如
cat
、bash
、 和python
都是此类可执行文件),或者由一些本身就是可执行文件的中间程序解释(Minecraft、pydoc
、 和cowsay
都是示例)这种类型的可执行文件)。第一种类型的可执行文件在 UNIX 系统上几乎没有文件扩展名,而第二种类型的可执行文件可能有也可能没有。这就是 FHS 所说的“二进制文件”。它们可以从其他可执行文件运行,但需要调用特殊函数来调用它们(fork()
在exec()
C 和 C++ 中,在 Python 中模块外的东西subprocess
等)并作为单独的进程运行。库:这些文件包含可重用代码,可以由另一个库或可执行文件调用。一旦库被加载(在谈论编译代码时称为“链接”),库中的代码(大多数)直接被其他代码调用,并在与调用它的代码相同的进程中运行。库分为三种通用类型:
- 静态库:这些是原始版本。它们由一个存档文件(通常是 AR 格式)组成,其中包含大量目标文件,每个目标文件对应库中的每个函数。目标文件链接到使用它们的可执行文件中,因此仅使用静态库的可执行文件本质上 100% 独立于任何其他代码。在 UNIX 系统上,它们通常具有
.a
扩展名。静态库的概念在编译的编程语言之外并不真正存在。 - 动态库:这些是当今最常用的库类型。动态库是一种特殊的目标文件,通常
.so
在 UNIX 上具有扩展名(.dll
是 Windows 上的标准),在运行时由使用它的可执行文件加载。您在生产系统中发现的大部分内容/lib
都是动态库。 - 模块:这相当于解释语言的动态库。处理与编译语言略有不同,与编译语言不同的是,文件可能既是模块又是可执行文件(请参阅
http.server
Python 标准库中的示例)。
- 静态库:这些是原始版本。它们由一个存档文件(通常是 AR 格式)组成,其中包含大量目标文件,每个目标文件对应库中的每个函数。目标文件链接到使用它们的可执行文件中,因此仅使用静态库的可执行文件本质上 100% 独立于任何其他代码。在 UNIX 系统上,它们通常具有