Ubuntu 20.4的Ncurses与18.04的版本不兼容吗?

问题描述 投票:0回答:1

我有2个curses程序,最初是在ubuntu 18.04上建立的--在那里都能正常运行,但当我把它们复制到新的20.04系统上并试图运行它们时,加载器说找不到libnces。

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

然后我删除了我安装的libncurses5的东西,并再次重建了这些应用程序(针对ncurses6,它仍然在安装)。 现在,其中一个应用程序正确地显示了所有的东西,但是另一个仍然显示错误的东西--而且是在错误的位置上。 顺便说一下,在我安装了ncurses5之前,gcc本来是找不到 "curses.h "的--但在卸载了ncurses5之后,它还是能找到它。

我怀疑我只是把$TERM设置错了(是xterm-256color--在Konsole运行的ssh会话中),但是为什么一个程序可以工作,而另一个程序却不行--同样的$TERM设置?

linux ncurses
1个回答
0
投票

ncurses在同一发行版中提供了多个ABI。 以前,默认的 ABI 是 5,现在是 6。 libncurses5 提供了 v5 ABI,而 libncurses6 提供了v6 ABI。 你不能使用一个软件与一个不兼容的ABI的共享库链接,因为不同的ABI的共享库路径是不同的,所以人们不会不小心加载错误的库而破坏他们的程序。

如果你想运行一个与ABI v5链接的现有程序,那么你需要libncurses5包。 你不需要-dev包,除非你是针对那个包进行开发。 如果你要重新编译一个现有的软件包,你应该使用 libncurses-dev,它将根据最新版本的ncurses进行编译,除非你确定你需要根据旧版本进行编译。 该软件包将包括 curses.h 头的位置。

如果你想指定诅咒头的位置,你应该用角括号来做。#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 会是一个更好的选择。 即使没有,你也可能需要检查你的终端设置,看看它所模拟的类型,因为有些终端仿真器支持多种终端类型。


0
投票

修正了。 原来,应用中不能工作的curses调用是在我没有在20.04系统上重建的库中。 能用的app中的curses代码在本地模块中,在我重建的时候重新编译了。

一旦我重建了带有curses调用的库,并重新链接了 "破损 "的应用程序,就可以用ncurses6来工作了。 虚惊一场。 对不起,对不起。

© www.soinside.com 2019 - 2024. All rights reserved.