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

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

OS X 10.13.2(高山脉)。

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

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

#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”文件

尝试在手册页中找到:

手动添加wstr 说:

   #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);

正如手册页所述,尝试包含“curses.h”而不是“ncursesw/ncurses.h”。再次编译错误:

test.cpp:9:5:错误:使用未声明的标识符“mvaddwstr”;您指的是“mvaddstr”吗?

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

macos ncurses
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 bundles 只有一个非常旧的 ncurses 库(5.7,于 2008 发布),以及相应旧的终端数据库。你可以通过

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

有趣的是,动态库的文件名暗示它实际上是 ncurses 5.4(又老了 4 年),但

tic
显示的编译版本和
curses.h
头文件告诉了实际版本。如前所述,该库包含宽字符库所需的符号。大多数系统使用的 ncurses 和 ncursesw 库之间的名称区别(再次)早于 ncurses 5.4 几年,因此 Apple 的配置会让大多数开发人员感到困惑。

对于开发,您应该考虑使用更新的东西,例如MacPortshomebrew。对于这些,配置详细信息很容易获得,并且(毫不奇怪)提供 ncursesw 库。

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