Curses库不支持OS X high sierra上的宽字符

时间:2017-12-31 11:51:15

标签: macos ncurses

OS X 10.13.2(高山脉)。

我尝试使用widechar支持编写简单的curses程序,但看起来,默认(预安装的库)curses不支持widechar:

最简单的程序示例(来自here):

#include <ncursesw/ncurses.h>
#include <locale.h>
#include <wchar.h>

int main() {
    setlocale(LC_ALL, "");
    initscr();
    wchar_t wstr[] = { 9474, L'\0' };
    mvaddwstr(0, 0, wstr);
    refresh();
    getch();
    endwin();
    return 0;
}

没有编译,给出错误:

  

test.cpp:1:10:致命错误:&#39; ncursesw / ncurses.h&#39;找不到文件

试图在手册页中找到:

  

man addwstr   表示:

   #include <curses.h>

   int addwstr(const wchar_t *wstr);
   int addnwstr(const wchar_t *wstr, int n);
   int waddwstr(WINDOW *win, const wchar_t *wstr);
   int waddnwstr(WINDOW *win, const wchar_t *wstr, int n);
   int mvaddwstr(int y, int x, const wchar_t *wstr);
   int mvaddnwstr(int y, int x, const wchar_t *wstr, int n);
   int mvwaddwstr(WINDOW *win, int y, int x, const wchar_t *wstr);
   int mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n);

正如man page所说,试图包含&#34; curses.h&#34;而不是&#34; ncursesw / ncurses.h&#34;。再次编译错误:

  

test.cpp:9:5:错误:使用未声明的标识符&#39; mvaddwstr&#39 ;;你是说&#39; mvaddstr&#39;?

试图在/ usr / include中找到任何与widechar相关的curses头。没有结果。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

如果你使用这样的命令,第二个例子(使用<curses.h>)将适用于MacOS:

gcc -o foo -D_XOPEN_SOURCE_EXTENDED foo.c -lncurses

那是:

  • 你必须打开一个定义才能使宽字符功能可见(通过阅读头文件可以看到),并且
  • 图书馆名称是&#34; ncurses&#34; (虽然它包含宽字符函数)。

待办事项

nm /usr/lib/libncurses.dylib | grep addwstr

看到这个:

0000000000024c39 T _addwstr
0000000000024fba T _mvaddwstr
00000000000254ad T _mvwaddwstr
000000000002580c T _waddwstr

截至2018年中期,MacOS 捆绑 只有一个非常古老的ncurses库(5.7,在2008中发布),以及相应的旧终端数据库。你可以通过

看到
$ /usr/bin/tic -V
ncurses 5.7.20081102

有趣的是,动态库的文件名提示它确实是ncurses 5.4(再过4年),但是 tic 和{显示的编译版本{1}}头文件告诉实际版本。如上所述,该库包含宽字符库所需的符号。用于大多数系统的ncurses和ncursesw库之间的名称区别早于ncurses 5.4(再次)几年,因此Apple的配置会让大多数开发人员感到困惑。

对于 开发 ,您应该考虑使用更新的内容,例如MacPortshomebrew。对于那些,配置细节随时可用,并且(不出所料)提供ncurses w 库。