Curses库在OS X High Sierra上不支持宽字符。

3

OS X 10.13.2(高Sierra)。

我正在尝试编写支持宽字符的简单curses程序,但似乎默认(预安装库)的curses不支持宽字符:

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

#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: 致命错误: 找不到'ncursesw/ncurses.h'文件

尝试在手册页面中查找:

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页的说法,尝试使用"curses.h"代替"ncursesw/ncurses.h"。再次编译错误:

test.cpp:9:5: error: use of undeclared identifier 'mvaddwstr'; did you mean 'mvaddstr'?

在/usr/include中尝试查找任何与宽字符相关的curses头文件,但没有结果。有什么建议吗?


请参阅 https://stackoverflow.com/a/77589748/2836621 - undefined
1个回答

2
第二个例子(使用<curses.h>)如果您使用以下命令,将适用于MacOS:
gcc -o foo -D_XOPEN_SOURCE_EXTENDED foo.c -lncurses

这是:
  • 您必须打开一个定义才能使宽字符特性可见(您可以通过读取头文件来看到),并且
  • 库名称为“ncurses”(尽管它包含宽字符函数)。

做:

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年),但由ticcurses.h头文件显示的编译版本告诉我们实际的版本。正如所述,该库包含宽字符库所需的符号。大多数系统中用于ncurses和ncursesw库的名称区别比ncurses 5.4(再次)早几年,因此苹果的配置会让大多数开发人员感到困惑。
对于开发,您应该考虑使用更近期的东西,例如MacPortshomebrew。对于这些内容,配置详细信息很容易获得,并且(不出所料)提供ncursesw库。

我尝试过你提供的方法,但没有成功。我已经包含了<ncurses.h><curses.h>,并使用g++ -D_XOPEN_SOURCE_EXTENDED -lncurses test.cpp进行编译,但仍然报错error: no matching function for call to 'waddnwstr'。你有任何想法如何解决这个问题吗?我是不是漏掉了什么东西? - LotoLo
应该是 **-lncursesw**。 - Thomas Dickey
我尝试了,但我使用的是macOS Sierra操作系统,没有ncursesw库。 - LotoLo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接