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

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

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

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

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

答案1

绝大多数.deb软件包,无论是否由官方存储库提供,都以前缀 进行安装/usr

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

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

一小部分.deb软件包,主要是使用以下命令创建的软件包迅速地,在里面创建一个特定于包的文件夹/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从已编译的软件创建自己的软件包,并从该软件包进行安装。然后包管理器就会知道发生了什么。创建一个供自己使用的包,不需要在其他人的计算机上正常工作,实际上并不难。 (但我觉得这可能超出了你的问题的范围,因为它目前的措辞。)

答案2

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

如果您从源代码编译程序,程序包管理器将无法识别它。 Linux 上的惯例是,你应该遵循这个惯例,因为你很难跟踪事情并被覆盖你的安装,它是:

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

在 Ubuntu 10.04 中将 vim/gvim 升级到 7.3 的最佳方法?获取获取最新版本软件的方法列表。最简单的方法是获得苯丙胺,如果有的话。如果您获得二进制包或从源代码编译,我建议使用存放管理您手动安装的软件。或者,制作你自己的.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.

答案3

这取决于包装和很多其他因素

  1. 使用的命名约定 - 二进制文件是否在文件名中包含版本号
  2. 安装位置 - 默认在opt中,但打包版本在/usr中
  3. 更多的可能性

长话短说:
没有通用的答案。它高度依赖于包。如果可能的话,您应该使用官方的+1 PPA,而不是从源代码编译。

相关内容