如何处理使用过时共享库的应用程序?

如何处理使用过时共享库的应用程序?

我正在尝试在正在寻找 libncurses.so.5 的 Linux 滚动发行版本上运行 GDB,但系统安装了版本 6。我见过人们使用 ln 将 libncurses.so.5 链接到版本 6 的解决方案,但这似乎不是一个好的做法(最新的内容可能已被弃用/删除)。

将旧库链接到新库是否可以接受,或者是否有更好的做法?

有关具体问题的更多详细信息:

  • 内核为 5.8 的 Manjaro Linux
  • 应用程序 (STCubeIDE) 未从 pacman 存储库安装(手动安装)

答案1

将旧库链接到新库是否可以接受

不。

由于二进制不兼容,程序可能随时崩溃。一般来说,除了使用发行版工具( 、等)/usr之外,乱搞系统文件(例如 下的所有内容)是一个愚蠢的想法。aptyum

有更好的做法吗?

保留旧的库(例如在 下/opt/oldlibs)并让程序通过LD_LIBRARY_PATH环境变量使用它们。详细信息在ld.so(8)联机帮助页。

答案2

将旧库链接到新库是否可以接受,或者是否有更好的做法?

它可能工作也可能不工作,具体取决于所使用的功能。

一般来说,这是一种不好的做法,但如果您不想追寻旧库并且您的旧应用程序可以使用此 hack,那么没有人会反对。

答案3

否 - 根据其网站,Manjaro 有 ncurses 6.2,并且由于它重用了 Arch 的包,所以它的软件包构建脚本告诉我们它使用的是 ABI 6,它与 ncurses 5 不二进制兼容。

例如,gdb 有一种使用 ncurses 在终端中显示调试信息的模式。如果在为 ncurses5 编译后强制使用 ncurses6,则突出显示和画线字符将无法正确显示。这是因为 ABI 5 和 ABI 6 之间屏幕上每个单元格的数据结构大小不同。

如果您这样做(链接 ncurses6 库以假装它们是 ncurses5),并尝试报告错误,您只会看到发行说明(例如ncurses 6.0) 和常问问题

如果我必须维护类似的东西,我会为 ABI 5 编译 ncurses(您可以使用 ncurses6 来完成此操作,如文档所述:仅默认配置脚本的值已更改)。

相关内容