当我尝试在旧的 Linux 服务器上安装最新版本的软件时(我没有 root 权限),有时需要 XXX-dev 或 XXX-devel 包,其中 XXX 是某个库的名称。例如,在CentOS中安装Python 3.7.4需要预安装libffi-devel。通过yum
或apt
需要 root 权限安装 XXX-dev 。分发 XXX 和 XXX-dev 的源代码听起来是一个好方法,可以让普通用户轻松安装各种软件。
那么,我的问题是为什么 XXX-dev 的源代码没有分发?有正当理由吗?
答案1
为什么XXX-dev的源代码没有发布?
因为您不需要或不想编译您在编译 Python 的 ffi 代码时使用的每个库。你想使用共享对象文件,(Windows 的等效项是 DLL)动态链接到您想要的库。事实上,正如另一个答案所暗示的那样,源代码是可用的。但这不是构建 Python 的 ffi 所需的。你需要标头和共享对象文件。
yum
通过或apt
需要 root 权限安装 XXX-dev 。
这并不是因为他们不安装源代码;而是因为他们不安装源代码。这是因为它们在系统级别运行。您不需要安装源代码,但您做需要具备以下条件:
XXX
, 这编译的库的共享对象文件XXX-dev
,源代码标头在库中定义函数,以便可以在代码中使用它们,但可以动态链接。
它们不必位于 root 拥有的位置,但它们做需要位于编译器/链接器/构建工具链能够找到的位置。无论您是否从源代码构建它们,都是如此。但是,将构建过程的所有小部分设置得恰到好处并不是一件容易的事,这就是发行版为您做这件事的原因。
不幸的是,这是 Python 的常见场景,它大量借鉴了 C 方面的知识,但依赖操作系统来提供这些库作为标准构建过程的一部分。也许可以说服 Python 在用户拥有的位置使用构建组件。我不知道怎么办。我建议你不要以此为目标,而是找到一种方法来解决“你需要安装库但没有权限”的问题:
- 容器技术允许进程使用不同的用户空间文件系统,但您的管理员可能不愿意为您提供该访问权限
- 请您的管理员安装您需要的每个软件包
- 使用不同的系统进行开发,您可以在其中安装所需的软件包
- 使用与系统库关系更健全的语言(Golang 通常不会遇到这个问题,因为它的库是通常作为 Golang 源代码分发,整个构建过程更加现代并且无需 root 权限即可运行)
答案2
源码-dev
和-devel
包是分散式;它包含在相应源码包的源代码中。对于libffi-devel
CentOS,请参阅RPM libffi
git 存储库,以及相应的源存档上游libffi
配送站点。