在 Debian/Ubuntu 上使用 wide-char ncurses 的正确方法是什么?
What is the correct way to use wide-char ncurses on Debian/Ubuntu?
我正在编写一个使用 ncurses 的应用程序。
在 Debian 和 Ubuntu 中,我可以在这些软件包之间进行选择:
- libncurses5-dev
- libncursesw5-dev
w
版本包括宽字符支持,这正是我想要的。
但是,如果我只安装 libndursesw5-dev
,当我用 -lncurses
或 -lncursesw
编译时,我会收到一条错误消息,它告诉我找不到 curses.h
或 ncurses.h
.
同时安装 libncurses5-dev
和 libncursesw5-dev
并使用 -lncursesw
有效,但我不确定这是正确的方法还是只是巧合。使用 -lncurses
将引入非宽字符库。
作为参考,在 Mac OS X 10.11 上,-lncurses
有效(支持宽字符),而 -lncursesw
根本无效。
Debian 安装两个 headers
/usr/include/curses.h
/usr/include/ncursesw/curses.h
作为兼容性的解决方法。后者与 "mostly" 兼容,但仅在 compile-time 上兼容。例如 WINDOW
结构在后者中更大。第一个 (/usr/include/curses.h
) 是 "standard",但比 ncursesw 库早了几年。因为移植 ncurses 的某些平台不使用 ncurses 作为系统 curses 库(例如,Solaris),所以规定将 ncurses 的 header 放在子目录中以避免覆盖(或冲突)系统的标准 curses.h
(请参阅 ncurses 常见问题解答 Is the ncurses library compatible with my system?)。
自从 Debian 开始使用 ncurses 作为系统 curses 库,它的打包者选择使用相同的解决方法来避免 ncurses 和 ncursesw 之间的冲突。一些其他系统上的打包者可以选择将 both 放在子目录中,并在他们的打包脚本中制作 link,例如
/usr/include/curses -> /usr/include/curses/ncurses.h
我记得 Cygwin 做过类似的事情,并为 unctrl.h
省略了 link(一个错误,因为它也是标准的 header)。
对于 OSX,系统仅提供 ncurses(不提供 ncursesw),大多数使用 ncursesw 的人通过 MacPorts 之类的工具来执行此操作,它会安装 ncursesw header(如果应用程序在为 ncursesw 编译时定义了 _XOPEN_SOURCE_EXTENDED
,则效果很好,
因为 WINDOW
的声明是 ifdef'd 以允许支持任一库)。 Debian 打包者更加谨慎,并选择将 header 分开。
我正在编写一个使用 ncurses 的应用程序。
在 Debian 和 Ubuntu 中,我可以在这些软件包之间进行选择:
- libncurses5-dev
- libncursesw5-dev
w
版本包括宽字符支持,这正是我想要的。
但是,如果我只安装 libndursesw5-dev
,当我用 -lncurses
或 -lncursesw
编译时,我会收到一条错误消息,它告诉我找不到 curses.h
或 ncurses.h
.
同时安装 libncurses5-dev
和 libncursesw5-dev
并使用 -lncursesw
有效,但我不确定这是正确的方法还是只是巧合。使用 -lncurses
将引入非宽字符库。
作为参考,在 Mac OS X 10.11 上,-lncurses
有效(支持宽字符),而 -lncursesw
根本无效。
Debian 安装两个 headers
/usr/include/curses.h
/usr/include/ncursesw/curses.h
作为兼容性的解决方法。后者与 "mostly" 兼容,但仅在 compile-time 上兼容。例如 WINDOW
结构在后者中更大。第一个 (/usr/include/curses.h
) 是 "standard",但比 ncursesw 库早了几年。因为移植 ncurses 的某些平台不使用 ncurses 作为系统 curses 库(例如,Solaris),所以规定将 ncurses 的 header 放在子目录中以避免覆盖(或冲突)系统的标准 curses.h
(请参阅 ncurses 常见问题解答 Is the ncurses library compatible with my system?)。
自从 Debian 开始使用 ncurses 作为系统 curses 库,它的打包者选择使用相同的解决方法来避免 ncurses 和 ncursesw 之间的冲突。一些其他系统上的打包者可以选择将 both 放在子目录中,并在他们的打包脚本中制作 link,例如
/usr/include/curses -> /usr/include/curses/ncurses.h
我记得 Cygwin 做过类似的事情,并为 unctrl.h
省略了 link(一个错误,因为它也是标准的 header)。
对于 OSX,系统仅提供 ncurses(不提供 ncursesw),大多数使用 ncursesw 的人通过 MacPorts 之类的工具来执行此操作,它会安装 ncursesw header(如果应用程序在为 ncursesw 编译时定义了 _XOPEN_SOURCE_EXTENDED
,则效果很好,
因为 WINDOW
的声明是 ifdef'd 以允许支持任一库)。 Debian 打包者更加谨慎,并选择将 header 分开。