首页 > 解决方案 > Ubuntu 20.4 中的 Ncurses 是否与 18.04 中的版本不兼容

问题描述

我有 2 个最初在 ubuntu 18.04 上构建的 curses 应用程序 - 两者都可以正常工作。

当我将它们复制到新的 20.04 系统并尝试运行它们时,加载程序说它找不到 libncurses5.so。所以我尝试安装 libncurses5(加上相应的 -dev 包),然后应用程序工作 - 一切正常显示。但后来我在 20.04 系统上重新构建了它们,虽然它们能够找到库并运行,但它们都显示了有趣的字符 - 其中一个没有正确定位内容。

然后我删除了我已经安装的 libncurses5 东西,并再次重建了应用程序(针对仍然安装的 ncurses6)。现在,其中一个应用程序正确显示了所有内容,但另一个应用程序仍然显示错误 - 并且位置错误。顺便说一句,在我安装 ncurses5 之前,gcc 最初无法找到“curses.h” - 但在卸载 ncurses5 后它仍然可以找到它。

那么,ncurses6 是否与 ncurses5 时代编写的代码不兼容?我怀疑我只是将 $TERM 设置错误(它是 xterm-256color - 在从 Konsole 运行的 ssh 会话中),但是为什么一个程序可以工作,而另一个程序却不能工作 - 使用相同的 $TERM 设置?

标签: linuxncurses

解决方案


ncurses 在同一发行版中提供多个 ABI。以前默认 ABI 是 5,现在是 6。 libncurses5提供 v5 ABI,并libncurses6提供 v6 ABI。您不能像这样使用与具有不兼容 ABI 的共享库链接的软件,因为共享库路径在 ABI 之间不同,因此人们不会意外加载错误的路径并破坏他们的程序。

如果要运行与 ABI v5 链接的现有程序,则需要 libncurses5 包。除非您针对该包进行开发,否则您不需要 -dev 包。如果您要重新编译现有包,则应使用libncurses-dev,它将针对最新版本的 ncurses 进行构建,除非您确定需要针对旧版本进行构建。该包将包括curses.h标题。

如果要指定 curses 标头的位置,您应该使用尖括号:#include <curses.h>. 它是一个系统路径,它肯定是由libncurses-dev.

如果您的程序使用的是常用的标准 curses API,那么为新版本的 ncurses 重新编译它应该不会改变任何内容。ABI 更改可能包括更改一些不影响显示但可能启用新终端功能的内部结构。curses API 的行为是标准化的,不会发生重大变化。

您的TERM设置很可能确实是问题所在。如果您在另一台计算机上运行 SSH 会话,则您运行它的系统可能缺少作为标准集一部分的终端定义,并且需要一个额外的包(在 Debian 和 Ubuntu 上ncurses-term),其中包括更多终端定义。您可以尝试infocmp xterm-256color在该系统上运行,假设它正在运行 ncurses,以查看您是否确实具有该终端定义。如果您这样做,它将打印终端信息,如果您不这样做,它将显示错误。

如果您在一个screentmux会话中,那么xterm-256color将是错误的终端类型,并且screen-256color将是一个更好的选择。即使没有,您也可能需要检查其模拟类型的终端设置,因为某些终端仿真器支持多种终端类型。


推荐阅读