使用ncurses库编译C程序时,-lcurses和-lncurses有什么区别?

7

我正在学习C语言并使用ncurses库。我看到了-lcurses和-lncurses两个引用,但是我还没有找到它们之间的区别(编译时都可以正常工作)。

感谢您的帮助!

4个回答

16

ncurses是原Unix curses库的开源克隆版本。通常情况下,libcurses.*指向libncurses.*以保持与原始库的兼容性,因此使用其中一个与另一个没有实际区别。

如果您安装了多个“curses类型”的库,-lcurses会将您的程序链接到默认库,而-lncurses则会显式地选择ncurses实现。


3
在Solaris等系统中,libcurses.so是原始的(Unix)curses库(或增强版curses库,但不是GNU libncurses库)。在Linux系统中没有区别。 - Jonathan Leffler
@JonathanLeffler:对于其他平台,如IBM AIX,也没有ncurses,而是原始或增强的curses。 - Luciano

5
在我的OpenSUSE 12.3系统中,即使已经安装了ncurses,也没有指向libcurses的链接。任何尝试使用-lcurses标志的C程序都会失败,直到将该标志更改为-lncurses。
OpenSUSE 12.3 > ls -al /usr/lib64/*curses*
-rw-r--r-- 1 root root 2225910 Jan 25  2013 /usr/lib64/libncurses.a
-rw-r--r-- 1 root root  780540 Jan 25  2013 /usr/lib64/libncurses++.a
-rw-r--r-- 1 root root      69 Jan 25  2013 /usr/lib64/libncurses.so
-rw-r--r-- 1 root root  782884 Jan 25  2013 /usr/lib64/libncurses++w.a
-rw-r--r-- 1 root root 2768222 Jan 25  2013 /usr/lib64/libncursesw.a
-rw-r--r-- 1 root root      70 Jan 25  2013 /usr/lib64/libncursesw.so

链接在Fedora 17上也缺失了。然而,在Ubuntu 13.04上链接是存在的:
Ubuntu 13.04 > ls -al /usr/lib/x86_64-linux-gnu/*curses*
lrwxrwxrwx 1 root root     12 Feb  8  2013 /usr/lib/x86_64-linux-gnu/libcurses.a -> libncurses.a
lrwxrwxrwx 1 root root     13 Feb  8  2013 /usr/lib/x86_64-linux-gnu/libcurses.so -> libncurses.so
-rw-r--r-- 1 root root 294180 Feb  8  2013 /usr/lib/x86_64-linux-gnu/libncurses.a
-rw-r--r-- 1 root root 158798 Feb  8  2013 /usr/lib/x86_64-linux-gnu/libncurses++.a
-rw-r--r-- 1 root root     31 Feb  8  2013 /usr/lib/x86_64-linux-gnu/libncurses.so

因此,在OpenSUSE和Fedora上编译时使用-lcurses会失败,但在Ubuntu上却可以。而使用-lncurses编译则适用于所有三个发行版。

要点:如果您希望您的代码能够在不同的Linux发行版上编译成功,应使用-lncurses。


0
在我的系统(Slackware64 13.0)中,libcurses.so和相关文件只是符号链接到ncurses等效文件,因此没有区别。 libcurses.so-lcurses)名称可能只是为了向为其他具有不同于ncurses的curses实现的系统设计的代码提供向后兼容性。

0
在我的(fedora 11)电脑上,/usr/lib/libcurses.so包含:"INPUT(-lncurses)"。我认为这意味着这两种形式(-lcurses,-lncurses)是等价的。

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