gcc /usr/bin/ld: error: cannot find -lncurses

34

我正在运行Ubuntu 12.04,目前在进行涉及C,OpenGL,茶壶和输入法的项目。

问题出现在我决定将箭头键作为输入时。我检查了箭头键的键码,但所有箭头都返回0。我查找了如何解决这个问题,并找到了conio.h。不幸的是,它是一个旧的DOS头文件,在Linux上不可用。然后我找到了一个名为ncurses的替代品。

通过仔细遵循构建说明,安装了必要的库,在我的main.c源代码中包含了curses.h。当我第一次尝试使用gcc编译时,我遇到了以下错误:

main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'
main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'

我通过在makefile中添加-lncurses找到了解决方法,如下所示:

SOURCES=main.c

main: main.o
    gcc -lm -lGL -lGLU -lglut -lncurses main.o -o main

main.o: main.c
    gcc -lm -lGL -lGLU -lglut -c main.c

但是我遇到了另一个错误:

/usr/bin/ld: error: cannot find -lncurses

除了之前的错误,还有这个错误。

我花了最近两天的时间在Ubuntu论坛和StackOverFlow上搜索。感谢任何帮助。

顺便说一下,我不知道这是否重要,但当我尝试运行/usr/bin/ld时,我会得到以下错误:

ld: fatal error: no input files

26
这条指令的意思是安装libncurses5-dev库,可以使用命令"apt-get install libncurses5-dev"来完成安装。 - trojanfoe
为什么这些注释非得那么小呢-_- 我之前没看到你的评论,但那就是解决方法。不知道为什么,似乎我安装了某种非官方版本,编译器无法识别。谢谢大家! - Yrrej10
3个回答

51

对于与我遇到相同问题的人:我缺少32位库;我在64位服务器上编译32位,该服务器缺少lib32ncurses5-dev软件包。

在Ubuntu上,我只需运行:

sudo apt-get install lib32ncurses5-dev

9
我无法通过pip在Python 2.7下安装gnureadline,但这个方法解决了我的问题。 - rioted

2
首先,在链接时应该将库文件放在目标文件之后,而不是在源文件的编译中使用它们。
其次,如果ncurses没有安装在标准搜索文件夹中,您需要使用-L命令行选项告诉链接器它的位置。
gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses

2
尝试安装 ncurses-static 包,如果你的 Ubuntu 操作系统中只安装了 ncurses-devel 包。如果这样解决了你的问题,并且你添加了 @Joachim 的编译说明,那么你就可以开始了。
gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses

链接器在其搜索路径中找不到您的共享库。如果将包含共享库的目录添加到LD_LIBRARY_PATH环境变量中,则链接器应该能够找到它并链接到它。在这种情况下,您可以省略gcc的-L选项:
gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses

它应该可以正常编译。

编辑: 好了解到apt-get install libncurses5-dev修复了你的问题。

顺便说一下。 LD_LIBRARY_PATH环境变量包含一个冒号分隔的路径列表,链接器在运行时使用这些路径来解析库依赖关系。这些路径将优先于标准库路径/lib/usr/lib。标准路径仍然会被搜索,但只有在LD_LIBRARY_PATH中的路径列表用尽后才会搜索。

使用LD_LIBRARY_PATH的最佳方法是在执行程序之前立即在命令行或脚本上设置它。这样,您可以使新的LD_LIBRARY_PATH与系统其余部分隔离,即局限于当前正在运行的shell实例。

$ export LD_LIBRARY_PATH="/path/to/libncurses/library/directory/:$LD_LIBRARY_PATH"
$ gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses

  1. 还有更多问题 :/ 我只有libncurses.so.5和libncurses.so.5.9两个文件,但都无法识别。
  2. LD_LIBRARY_PATH变量在哪里找?
- Yrrej10
不要使用 $LD_LIBRARY_PATH;如果需要配置非标准的加载器路径,则在 /etc/ld.so.conf.d 中创建一个文件。 - trojanfoe
现在我有点困惑了。我查看了/etc/ld.so.conf.d目录下的文件,发现ncurses库位于以下目录中: lib/i386-linux-gnu和usr/lib/i386-linux-gnu。 - Yrrej10

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