问题基本上是标题。也就是说,包管理器如何在Linux中说apt知道或决定在哪里安装文件?
问题的出现是因为您可以从Makefile进行构建,然后在执行构建的目录中运行可执行文件--也就是说,没有执行安装的规则。或者可能有安装规则,但是如何确定应该在何处安装文件?类似地,apt会安装软件包,但是文件在哪里安装的规则是什么呢?
发布于 2022-05-09 03:14:24
例如,您可以从Makefile进行构建,然后在执行生成的目录中运行可执行文件。
对于某些程序来说,这是正确的,通常是那些没有任何依赖项的程序。如果一个程序有它需要的其他文件,它需要知道在哪里找到它们。这样的路径在编译中被“烘焙到”可执行文件中,如果不重新编译程序,就不能更改。
通常,这些文件的位置将位于某种前缀下(例如$PREFIX/bin、$PREFIX/share/...、$PREFIX/lib/...),程序将被配置为使用configure脚本的前缀,从而创建Makefile。默认前缀通常是根目录或/usr,这就是为什么大多数可执行文件都位于/bin或/usr/bin中。您可以使用./configure --prefix=$NEW_PREFIX设置不同的前缀。
如果我不是root用户,我会在$HOME/.local中安装我的大部分程序,所以我可以在/home/amadan/.local/bin/...中获得可执行文件。随后的make编译当前目录中的程序,然后make install将所有内容放入配置的位置。
例如,ffmpeg有许多依赖项;例如,其中一个依赖项是lib/libavcodec.a。如果我以用户身份编译它(使用./configure --prefix="$HOME/.local"),那么在/home/amadan/.local/lib/libavcodec.a完成了它的工作后(很明显,还有/home/amadan/.local/bin/ffmpeg),我就会使用make install。如果我试图在没有ffmpeg的情况下在其构建位置运行make install,它将无法工作,因为它会在错误的位置查找其支持文件。
--也就是说,包管理器如何在Linux中说apt知道或决定在哪里安装文件?
包管理器本身没有。放置文件的位置是在包内定义的。确切的机制取决于包管理器。例如,apt主要使用.deb文件,其中包含(以及其他文件)数据存档。数据存档(以TAR格式,可能是压缩)将包含具有完整路径的文件,因此如果您在根目录中提取存档,文件将放在它们所属的位置。
例如,wget_1.21-1+deb11u1_arm64.deb包含data.tar.xz,其中包含:
./
./etc/
./etc/wgetrc
./usr/
./usr/bin/
./usr/bin/wget
...etcapt将在根文件夹中解压缩,最终得到/usr/bin/wget。
https://stackoverflow.com/questions/72166542
复制相似问题