举个例子,假设我想升级 sqlite3。我(apt-get)更新和升级后的版本是3.7.13。最新版本是 3.7.14。如果我从源代码安装最新版本,我是否可以知道它不会破坏这台计算机上的现有软件?是否有一些软件依赖于其他软件的列表?
对于sqlite3来说并不是真的有必要,但我仍然想知道一般情况。
我正在运行 Debian 喘息。
答案1
二进制兼容性 - ABI 和 API
要了解为什么更新可能会或可能不会破坏计算机上的现有软件,您应该对库有一个模糊的认识ABI沙APIs。看这个相关问题在 StackOverflow 上了解更多信息。
共享库版本控制
软件通常至少带有主要版本号和次要版本号。我读到,一般来说,任何 ABI 不兼容性都应该随着主版本号的更改而引入。因此,如果您要在次要版本之间进行升级,通常应该安全地安装新版本而不是旧版本。
安装的共享库应该在文件名后附加一个版本号,这通常与发布版本号。构建源代码时,依赖于该共享库的其他应用程序将被链接。然后,生成的二进制文件应该使用动态链接器来查找正确的共享库,并通过其标识主要的版本号。 (这可能取决于所使用的链接器,并且可能有一个ld
选项,允许您指定次要版本..)
libsqlite3
以 libsqlite3-0 (3.7.13-1) 为例,我有一个共享库文件和两个指向该库的符号链接:
> ls -l /usr/lib/x86_64-linux-gnu/libsqlite3.so*
lrwxrwxrwx 1 root root 19 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so -> libsqlite3.so.0.8.6
lrwxrwxrwx 1 root root 19 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 -> libsqlite3.so.0.8.6
-rw-r--r-- 1 root root 692984 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6
那么,如何判断一个库或可执行文件是否已链接到该库,以及它依赖于哪个版本?
在 Linux 上,使用:
`ldd <filename>`
在 OS X 上:
`otool -L <filename>`
例如,让我们看看 Python 的 sqlite 模块需要什么版本的 libsqlite3 才能运行。
> ldd /usr/lib/python2.7/lib-dynload/_sqlite3.so | grep sqlite
libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fe32872c000)
因此它只需要主版本编号的符号链接,而不需要完整命名和编号的共享库。然后更新,应该只更新 libsqlite3.so[.0] 符号链接以指向新的共享库。
从源代码构建一个尖端的 libsqlite 将有望创建一个具有相同主版本号的共享库。如果没有,您始终可以覆盖符号链接并将其指向所需的版本,进行测试,并在必要时恢复到系统包。
资质
当您使用 Debian 时,我想我还要提到它aptitude
允许您查看“依赖于 libsqlite3-0 (267) 的软件包”(对于任何其他软件包也是如此)。当然,如果您从源代码编译了很多应用程序,并且没有通知dpkg
这一点,那么这个列表可能并不详尽。