从源代码编译对已安装应用程序的影响

Phi*_*rio 13 compiling ubuntu software-installation package-management

我使用 Ubuntu 12.04。假设我package x已从 1.7 版的存储库(及其所有依赖项)安装,但我需要一些仅在 1.8 版中可用的功能,因此我下载源 tar 并编译它:

./configure  
make  
make install
Run Code Online (Sandbox Code Playgroud)
  • 这会覆盖现有的 1.7 二进制文件吗?
  • 如果现有的二进制文件被覆盖,包管理器是否反映了新版本 (1.8) 并且可以package x在未来由包管理器更新?
  • 如果package y有 - 的依赖,package x 1.8它会被满足吗?

我一直试图在网上找到一个很好的来源来解释这一点。如果您有任何建议,请让我知道。

Eli*_*gan 17

绝大多数.deb软件包,无论它们是否由官方存储库提供,都使用前缀/usr.

这意味着打算由用户运行的可执行文件进入/usr/bin/usr/sbin(或者/usr/games如果它是游戏),共享库进入/usr/lib,与平台无关的共享数据进入/usr/share,头文件进入/usr/include,自动安装的源代码进入/usr/src

一小部分包/用作前缀。例如,bash包将bash可执行文件放在 中/bin,而不是/usr/bin. 这是提供最基本的要素在单用户模式(如恢复模式)运行,并启动多用户模式(但请记住,这通常包括功能安装某些类型的网络共享包......万一/usr是远程文件系统)。

一小部分.deb包,主要是那些用Quickly创建的包,在里面创建一个包特定的文件夹/opt,并将所有文件放在那里。除此之外,大多数时间/opt是从可执行安装程序安装的软件使用的位置,该安装程序不使用系统的包管理器但不涉及从源代码编译。(例如,如果您安装了像 MATLAB 这样的专有程序,您很可能会将它放在/opt.)

与所有这些相反,当您下载源存档(或从 Bazaar 或 git 等修订控制系统获取源代码)、构建它并安装它时,它通常会安装到前缀/usr/local(除非您告诉它这样做)除此以外)。这意味着你的可执行文件中去/usr/local/bin/usr/local/lib或者/usr/local/games,你的图书馆/usr/local/lib,等等。

对此有一些例外——默认情况下,某些程序安装到/usr前缀,因此会覆盖从.deb包中安装的相同程序。通常,您可以通过运行./configure --prefix=/usr/local而不是./configure在构建它们时防止这种情况发生。我再次强调,通常这不是必需的。

(正是出于这个原因,将您正在构建的源代码并将安装在系统范围内使用的源代码对您来说非常有意义/usr/local/src,而 .)

假设安装了打包版本/usr并且您从源安装的版本在/usr/local

  • 安装包中的文件不会被覆盖。

    通常,当您从命令行手动调用程序时,较新的版本将运行(假设/usr/local/bin安装了可执行文件的地方或任何位置都在您的PATH环境变量中并出现在相应的 -/usr前缀目录之前,例如/usr/bin)。

    但是,通过菜单或搜索创建和访问的启动器可能存在一些问题。此外,如果您在不同地方安装了多个版本的库,则确定哪些软件将使用哪个版本可能会变得更加复杂。

    如果您实际上没有同时使用程序或库的两个版本,那么通常您应该删除不使用的那个,尽管在有限的情况下您可能希望保留安装的软件包以满足依赖关系。

但是,如果由于任何原因文件被覆盖(例如,如果源代码安装在/usr而不是 中/usr/local):

  • 包管理器不会知道它安装的软件是如何更改的。它会认为安装了旧版本。可能会导致不好的问题。你应该避免这种情况。如果你已经造成了这种情况,你应该卸载你从源代码安装的软件(通常sudo make uninstall在目录中),然后卸载提供被覆盖文件的一个或多个包(因为它们不会通过卸载安装的版本来恢复)来源)。然后重新安装您想要的任何版本。/usr/local/src/program-or-library-name

至于履行依赖关系:

  • 如果存在.deb依赖于您从源代码安装的软件的软件包,并且需要您从源代码(或更高版本)安装的版本,则该软件包将无法成功安装。(或者,更准确地说,您可能能够“安装”它,但它永远不会被“配置”,因此您将无法使用它。)依赖关系由安装的软件包版本决定,而不是由你实际拥有什么软件。

    同样,即使您手动删除了所安装软件所依赖的软件包提供的文件,软件也至少会尝试完全安装。(您通常不应该出于任何目的尝试利用它。基于虚假信息运行的包管理器几乎总是一件坏事。)

因此,如果您找不到提供所需软件版本的软件包,您可能需要根据您.deb编译的软件创建自己的软件包,然后从该软件包进行安装。然后包管理器就会知道发生了什么。创建一个自己使用的包,你不需要在其他人的计算机上很好地工作,实际上并不难。(但我觉得这可能超出了你的问题范围,因为它目前的措辞。)


Gil*_*il' 5

您从软件中心或使用 APT 命令 ( apt-get, aptitude) 或使用安装的dpkg内容为包管理系统所知。dpkg是低级包操作工具,APT 和friends 是高级工具,它们调用dpkg以执行实际安装并处理依赖项和包下载。

如果您从源代码编译程序,包管理器将不知道它。Linux 上的约定,您应该遵循它来解决难以跟踪事物和覆盖安装的痛苦,它是:

  • /bin, /lib, /sbin,/usr保留给包管理器;
  • 除了这/usr/local是给系统管理员的——尊重那里的目录层次结构,但你可以自己管理文件。

请参阅在 Ubuntu 10.04 中将 vim/gvim 升级到 7.3 的最佳方法?获取获取最新版本软件的方法列表。最简单的方法是获取PPA,如果有的话。如果您获得二进制包或从源代码编译,我建议使用stow来管理您手动安装的软件。或者,制作你自己的.deb——它需要更多的工作,但如果你经常升级(通常为下一个次要版本重做包非常快)或者如果你部署到运行相同发行版的多台机器上,它会得到回报。

对于大多数程序,如果您运行./configure && make && sudo make install,该程序安装在/usr/local. 请检查随源提供的文档(通常在名为README或的文件中INSTALL)或运行./configure --help以检查是否是这种情况。如果程序安装在 下/usr/local,它不会干扰包管理器提供的版本。/usr/local/bin在系统上排在第一位PATH。请注意,您需要以make install管理员(root)身份运行;不要以 root 身份编译。如上所述,我建议使用 stow 而不是直接安装到/usr/local.