我是一个相对较新的 Ubuntu 服务器用户,所以我正在边学习边学习。我正在安装的软件包(QGIS)有问题,该软件包有几个依赖项,其中之一是gdal
库。无论我使用什么安装管理器(apt、synaptic 或 aptitude),此软件包都会安装相当过时的 gdal 版本 1.7.3(当前稳定版本是 1.9.1)。如果我自己还没有构建/编译 gdal 的最新版本,我不会有任何问题(我选择这样做,所以我可以包含一些不常见的光栅格式支持)。
如果我输入dpkg --list
,我可以看到两个库并排存在,但我什至不想要旧的。经过一番修补后,我在安装过程中使用了突触并手动禁用了 gdal 依赖项,然后我编译的 gdal 1.9.1 版本开始运行。为什么 QGIS 不从一开始就使用最后一个版本?
另外,Linux 有没有办法检查是否需要安装依赖项?或者,有没有办法更改某些包在安装后使用的库?
答案1
每个 deb 包都有安装前应满足的依赖项列表。您可以使用 列出 deb 文件的依赖项dpkg --info path_to.deb
。这是示例:
new debian package, version 2.0.
size 5800810 bytes: control archive=2527 bytes.
1301 bytes, 20 lines control
3074 bytes, 41 lines md5sums
721 bytes, 22 lines * postinst #!/bin/sh
637 bytes, 18 lines * postrm #!/bin/sh
Package: qgis
Version: 1.8.0~precise1
Architecture: i386
Maintainer: Quantum GIS developers <[email protected]>
Installed-Size: 10374
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libgdal1-1.7.0, libgsl0ldbl (>= 1.9), libpq5, libproj0, libqgis1.8.0, libqt4-network (>= 4:4.5.3), libqt4-sql (>= 4:4.5.3), libqt4-svg (>= 4:4.5.3), libqt4-xml (>= 4:4.5.3), libqtcore4 (>= 4:4.8.0), libqtgui4 (>= 4:4.8.0), libqtwebkit4 (>= 2.2~2011week36), libqwt5-qt4, libspatialite3 (>= 3.0.0~beta20110817), libsqlite3-0 (>= 3.5.9), libstdc++6 (>= 4.6), qgis-providers (= 1.8.0~precise1), qgis-common (= 1.8.0~precise1)
Recommends: qgis-plugin-globe, qgis-plugin-grass, python-qgis
Suggests: gpsbabel
Conflicts: uim-qt3
Section: science
Priority: extra
Homepage: http://qgis.org/
Description: Geographic Information System (GIS)
A Geographic Information System (GIS) manages, analyzes, and displays
databases of geographic information. Quantum GIS (QGIS) supports shape file
viewing and editing, spatial data storage with PostgreSQL/PostGIS, projection
on-the-fly, map composition, and a number of other features via a plugin
interface. QGIS also supports display of various georeferenced raster and
Digital Elevation Model (DEM) formats including GeoTIFF, Arc/Info ASCII Grid,
and USGS ASCII DEM.
对您来说最重要的是“取决于”部分包含必须安装才能安装您的软件包的软件包及其版本的列表。对于每个包,可以有关于确切版本、最小版本或最大版本的信息。
正如您在上面看到qgis
的需要libgdal1-1.7.0
(它的名称而不是版本)。 Ubuntu 存储库中此软件包的当前版本是1.7.3-6ubuntu3
(请注意,未提供软件包的最小版本!)。
./configure && make && make install
当您从源(或类似的东西)编译该库时,您将该包的二进制文件放在系统目录中。但是,当您通过 apt、synaptic 或 aptitude 安装软件包时,它们并不关心二进制文件。他们正在使用已安装的软件包索引(位于 中的某个位置/var/
),并且他们不知道您从源安装了该库,因此他们正在安装所有依赖项。为了让该工具知道系统中存在,gdal
您可以从编译的源代码中准备 deb 包并使用 dpkg 安装它。 Debian 的 wiki 上应该有一些关于这方面的教程。但即使你准备这样的包,包管理工具仍然会寻找带有名称的包libgdal1-1.7.0
(当然你可以用gdal
1.9.1 准备包并命名它libgdal1-1.7.0
,但这不是一个好主意 - 新版本中可能会有一些 API 更改,它可能qgis
会崩溃或类似的情况)。
为什么qgis
使用旧的gdal
?
Ubuntu 的发布周期很长,因此当软件包存储库被冻结时,由于某些原因,使用该软件包的旧版本可能是更好的主意。或者可能没有人愿意准备新版本? ;)
有没有办法更改依赖列表?
是的。您可以下载选定的包并使用更改后的依赖项列表重新打包它:
mkdir tmp
dpkg -x package.deb ./tmp
dpkg -e package.deb
nano ./tmp/DEBIAN/control and change dependency list
mkdir ./build
dpkg-deb -b ./tmp ./build
您可以这样做,但是由于全局安装的软件包列表不一致,您将来安装软件时可能会遇到一些问题。
答案2
有时,从源代码编译新版本是问题的唯一可能解决方案,但作为一般规则,除非绝对必要,否则最好避免这样做。绕过软件包系统通常意味着获得短期解决方案来解决许多长期问题。如果您编译并安装较新版本的 gdal 到 /usr/local 中,那么您也应该编译 gqis。
更好的问题是:“我在哪里可以获得 Ubuntu 的更新的 gdal 库包?”接下来是“我在哪里可以获得 Ubuntu 编译使用的 gqis 包?”
这两个问题的答案是,两者的新版本都打包在即将推出的 Ubuntu 的“量子”版本中,该版本将于大约一个月后发布。目前,Quantal 有以下版本(但这可能会在发布时发生变化)
http://packages.ubuntu.com/quantal/qgis (1.7.4+1.7.5~20120320-1.1)
http://packages.ubuntu.com/quantal/libgdal1 (1.9.0-3ubuntu3)
可以配置 apt,使其了解 Ubuntu Precise 和 Ubuntu Quantal 中的软件包,但默认情况下更喜欢 Precise 中的软件包。这将允许您强制安装某些软件包的量子版本。
在这里或在姐妹网站上搜索,例如https://askubuntu.com/对于“APT Pinning”,了解如何执行此操作的详细信息 -https://askubuntu.com/questions/103320/install-packages-from-newer-release-without-building-apt-pinning例如。
请注意,像这样从较新版本的 Ubuntu 安装较新的软件包可能会导致其他软件包升级,即使您没有指定它们 - 如果您要安装的软件包依赖于其他软件包的较新版本,那么满足的唯一方法这些依赖项也需要安装它们。
另一种选择是向后移植 - 即从 Quantal 下载 libgdal1 和 gqis 的 debianized 源代码并重新编译 Precise 的软件包。这可能涉及下载和重新编译这两个依赖的任何其他包的源包(反过来,这些额外的包也可能更新了需要重新编译的依赖项......等等)。通常,向后移植这样的包比使用 apt pinning 需要做更多的工作。