Ubuntu 16.04 chroot 环境下 ncurses refresh() 需要哪些库/文件

Ubuntu 16.04 chroot 环境下 ncurses refresh() 需要哪些库/文件

我将我的问题追踪到以下几点。如果我单独运行我的应用程序,它工作得很好。但是,如果我chroot这样做,它似乎工作正常,直到当前游戏结束,然后它调用该refresh()函数进行核心转储。有人可以给我一些关于该refresh()函数可能需要但环境中没有的东西的指示吗chroot

我有这段代码调用它:

move(My_pos.y, My_pos.x);
printw("AARRrrgghhhh....");
move(My_pos.y+1, My_pos.x); /* ZZZ */
printw("before refresh"); /* ZZZ */
refresh();
move(My_pos.y+1, My_pos.x); /* ZZZ */
printw("done with refresh"); /* ZZZ */

ZZZ 行证明了错误 - “刷新前”无论哪种方式都可以工作,但“刷新完成”仅发生在非 chroot 调用中。在 chroot 中它核心转储...

有任何想法吗?

答案1

您可能只复制了高级库,例如,libncurses.solibncursesw.so,但 Debian(以及派生发行版,例如 Ubuntu)用两个库( , 等)配置libtinfo.solibtinfow.so。实际的文件名可能以主要/次要版本结尾,例如

libncursesw.so.6.0

refresh使得 ncurses 尝试更新实际显示;使用低级库。高级库在内存中完成其工作。

回应后续讨论(应该是新的问题),

  • 您可以“始终”使用静态库构建 ncurses,但随后您必须使用 ncurses 重新链接任何应用程序。
  • 要解决共享库的问题,您可能会发现以下内容很有帮助lddstrace在 chroot 内部工作,以 (a) 证明路径名位于预期位置,以及 (b) 执行正确的文件名。

如果您的应用程序仅与“ncurses”链接,例如,

gcc -o foo foo.c -lncurses

那么链接器可能不会抱怨(因为一些打包器将链接器选项设置为允许这个),但是运行ldd共享库上可能会出现问题,

ldd libncurses.so.6.0

strace程序可以显示程序尝试/成功的文件(包括加载共享库)。

相关内容