6.1 用curses函数库进行编译

curses函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。虽然比起使用哑终端和慢速调制解调器的年代,输出字符的数量已显得不那么重要,但curses函数库仍是程序员工具箱中一个有用的工具。

由于curses是一个函数库,所以在需要使用它时,你必须在程序中包含对应的头文件、函数声明和宏定义。curses函数库有多种不同的实现版本,最早的版本出现在BSD版本的UNIX系统中,后来被集成到系统V风格的UNIX系统中,其后又由X/Open组织对curses进行了标准化。Linux使用的curses版本是ncurses(又称为new curses),它是在Linux系统上开发的、针对系统V版本4.0上curses函数库的免费仿真软件。这个版本可以方便地移植到其他UNIX版本中,虽然它还包括了一些附加的不可移植的功能。现在甚至还有针对MS-DOS和Windows系统的curses版本。如果使用的UNIX系统自带的curses函数库不支持某些功能,你可以尝试获取一份ncurses函数库来替换它。Linux用户通常都会发现系统已预装好了ncurses函数库,或至少安装好了运行基于curses函数库的程序所需的组件。如果ncurses的开发函数库并没有在Linux发行版中预装(系统中没有头文件curses.h或用于链接的curses库文件),它们通常会以一个标准软件包的形式存在于大多数主要的Linux发行版中,例如,它可能被命名为libncurses5-dev。

X/Open规范定义了两个级别的curses函数库:基本curses函数库和扩展curses函数库。扩展curses函数库包含一组混杂的附加函数,比如处理多列字符和控制颜色的函数。除在本章的后面会讨论颜色的使用外,我们主要介绍的都是基本curses函数。

当对使用curses函数库的程序进行编译时,你必须在程序中包含头文件curses.h,并在编译命令行中用-1curses选项来链接curses函数库。在许多Linux系统中,你可以直接使用curses,但你会发现实际使用的是更好的、更新的ncurses实现版本。

你可以检查自己的curses的配置情况,命令

ls -1 /usr/include/*curses.h

用来查看curses头文件,命令

ls -1 /usr/lib/libcurses

用来检查库文件。如果发现头文件curses.h和ncurses.h都只是链接文件,而且系统中存在一个ncurses库文件,那么你就可以使用如下命令来编译本章中的程序:

$ gcc program.c -o program -lcurses

但如果curses配置并未自动使用ncurses函数库,那么你可能不得不在程序中明确包含头文件ncurses.h而不是curses.h来强制使用ncurses函数库,同时需要执行如下的编译命令:

$ gcc -I/usr/include/ncurses program.c -o program -lncurses

其中,-I选项用于指定搜索头文件的目录。

在可下载的源代码中包含的Makefile文件默认会假设你的配置使用的是curses,如果你的系统不是这种情况,你必须修改该文件或手工编译本章的程序。

如果不能确认你的系统中的curses究竟是如何配置的,你可以参考ncurses的手册页或查看其他在线文档,常见的在线文档目录位于/usr/share/doc/之下。在该目录中,你会发现curses或ncurses子目录,通常在该名称后面还会附加版本号。