Ubuntu 软件包管理问题

Ubuntu 软件包管理问题

我已经使用 synaptic 包管理器安装了 GStreamer,但我想升级到较新的版本。我对包管理不太熟悉,因此我有几个问题:

  • 我可以让 apt-get 帮我找到更新的版本吗?还是我需要自己下载最新版本并从源代码构建?
  • 如果我从源代码构建,然后执行“make install”,那么我的系统上是否会有两个不同的版本?
  • 如果是,那么系统如何决定使用哪个版本?
  • 我可以告诉系统使用旧版 GStreamer 处理所有事情,但使用新版 GStreamer 库来链接我的代码吗?如果可以,该怎么做?

我仅使用 GStreamer 作为示例,我感兴趣的是这些问题通常是如何处理的。

答案1

你当然还有一些选择。

通过 Apt 获取较新版本?

Ubuntu 的主存储库不提供官方软件包的重大升级。它们确实提供错误修复和安全更新;更新的主要版本通常在 Ubuntu 的下一个主要版本中提供(Ubuntu 10.04,又名 Lucid,目前处于 alpha 阶段)。

  • 你可以在官方存储库中搜索该包看看有哪些可用的版本,以及在哪个版本中。目前,Karmic 似乎正在使用Gstreamer 0.10.25,而 Lucid 目前包含同一版本的次要更新。主要更新可能可在 Ubuntu 的backports存储库中找到;这些是来自较新版本的较新软件包,这些软件包已构建为可在较旧的 Ubuntu 版本上运行。您可能遇到这些软件包的依赖问题,因此请谨慎行事。

  • 您可能会找到提供较新版本 Gstreamer 的第三方存储库,但这些存储库不受官方支持。可以查找的地方可能是Launchpad 的 PPA 系统,它们类似于个人存储库。使用 将 PPA 添加到您的 APT 存储库列表sudo add-apt-repository ppa:<ppa-name>

自己将其移植回去?

这也称为“构建你自己的本地包“。如果你感兴趣的软件包的较新版本在某些存储库或 PPA 中可用,但没有在构建时考虑到了您的 Ubuntu 版本,您最好获取源代码并自行编译。

这里的缺点是,除非该包被设计为与早期版本的库并行安装,否则它可能会代替您的原始系统软件包。优点是软件包管理器知道所有事情,因此您可以使用软件包管理器在必要时删除软件包或稍后升级,而不是在您需要的地方安装。

基本步骤如下:

  • 安装构建工具;
  • 安装编译包所需的依赖项;
  • 获取软件包源(原始源 tarball、ubuntu/debian 补丁和.dsc文件);
  • 编译并打包。

自动化方式(apt-get source packagenameapt-get build-dep packagename等,更多详情请见此处) 要求您的 APT 配置为访问具有正确版本软件包的源存储库。由于我们要反向移植较新的版本,我更喜欢手动方式(详见同一链接):找到软件包源(在Lucid 存储库,在 Launchpad PPA 等中),使用wget或 Firefox 或其他任何方式下载它们,然后在其中运行它们~/debian-build

  • 这将解压源代码并应用补丁。(.dsc首先将 tarball、补丁和文件移到目录中。)

    dpkg-source -x foo_version-revision.dsc
    
  • 构建软件包。(检查编译文档以确保已安装必要的构建依赖项。 apt-get build-dep <packagename>可能会解决问题,但可能会有所不同。大多数情况下,apt-get build-dep安装-dev包含头文件等的系统库软件包版本。)

    dpkg-buildpackage -rfakeroot -b
    
  • 安装新的本地包。

    dpkg -i ../foo_version-revision_arch.deb
    

忘记包裹了吗?

自己从源代码编译库/程序,无需软件包管理器的帮助。无需卸载,无需自动升级,只需“ ./configure ; make ; sudo make install”。

这实际上可以归结为两个选择:

  • 安装到默认位置(例如)。使用或/usr从包管理器中删除旧版本,或者直接让其覆盖包版本。 apt-get remove <packagename>apt-get purge <packagename>make install

    但...删除系统包而不替换它会导致依赖性问题。当你意识到 APT 因为你清除了一个库而卸载了你的桌面管理器时,这可不是什么好事。

  • 安装到/usr/local/opt/<package>-<version>或其他非系统软件标准位置。这意味着告诉配置脚本将其安装到哪里。

    ./configure --prefix=/usr/local
    

    好多了为了您的系统和理智;您的软件包管理器不会试图卸载您的内核;并且您的库将以一种方式安装,您可以将一个库用于系统目的,另一个库用于测试或编译。

处理并排安装?

这完全取决于您要做什么。假设您保留了系统包并将新版本安装到/usr/local。新库位于/usr/local/lib,头文件位于/usr/local/include,二进制文件位于/usr/local/bin,等等。

您通常可以通过以下三种方式之一访问新版本:

  1. 在命令行上一次指定一个(使用 shell 别名或手动指定);
  2. 改变你的 shell,以便默认访问新版本(例如,使用 shell 别名导出改变的环境变量,以便该 shell 中的所有命令都配置为首先获取新版本);或者
  3. 调整系统环境变量,使新版本成为系统默认版本(使用另外两个选项之一来使用旧版本)。

这取决于您正在访问的内容:可执行文件、库等等。

  • 正在运行安装到 /usr/local/bin 的程序?更改您的环境PATH,使 /usr/local/bin 位于 /usr/bin 之前,或者在命令行上提供二进制文件的完整路径。

  • 使用新版本的库从系统运行程序?LD_LIBRARY_PATH环境变量是PATH动态库的。您可以在/etc/ld.so.confldconfig进行更改后运行)中设置系统默认值。

  • 为了编译另一个包,您通常会将特定选项传递给gcc(或make./configure) 来指定头文件 (“包含”) 和库的位置,如下所示(我认为......):

    ./configure --with-gstreamer=/usr/local
    

答案2

如果 apt-get 找不到较新的版本,则可能不存在,或者您可能需要添加存储库。

如果您从源代码构建并执行“make install”,您将获得 a.) 两个版本,或 b.) 多个版本的混合版本。安装到 /usr/local/ 有助于确保您获得 a.)。更​​好的想法是删除 Apt 版本。

Gnome(或 KDE)系统的 shell PATH 参数用于确定首先选择哪个应用程序。

使用两者的最简单方法是将新版本安装到 /usr/local/,并创建桌面快捷方式来使用它。

相关内容