![Ubuntu 软件包管理问题](https://linux22.com/image/1224561/Ubuntu%20%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86%E9%97%AE%E9%A2%98.png)
我已经使用 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 packagename
,apt-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
,等等。
您通常可以通过以下三种方式之一访问新版本:
- 在命令行上一次指定一个(使用 shell 别名或手动指定);
- 改变你的 shell,以便默认访问新版本(例如,使用 shell 别名导出改变的环境变量,以便该 shell 中的所有命令都配置为首先获取新版本);或者
- 调整系统环境变量,使新版本成为系统默认版本(使用另外两个选项之一来使用旧版本)。
这取决于您正在访问的内容:可执行文件、库等等。
正在运行安装到 /usr/local/bin 的程序?更改您的环境
PATH
,使 /usr/local/bin 位于 /usr/bin 之前,或者在命令行上提供二进制文件的完整路径。使用新版本的库从系统运行程序?
LD_LIBRARY_PATH
环境变量是PATH
动态库的。您可以在/etc/ld.so.conf
(ldconfig
进行更改后运行)中设置系统默认值。为了编译另一个包,您通常会将特定选项传递给
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/,并创建桌面快捷方式来使用它。