C语言 gcc /usr/bin/ld: error: cannot find -lncurses



我运行的是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

对于任何有相同问题的人:我缺少32位库;我在64位服务器上编译32位,缺少lib32ncurses5-dev包。

在Ubuntu上,我只是运行:

sudo apt-get install lib32ncurses5-dev

首先,在链接时应该将库放在对象文件之后。并且在编译源文件时根本不需要它们

之后,如果ncurses没有安装在一个标准的搜索文件夹中,你需要指出它在哪里,这是通过-L命令行选项完成的:

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses

如果您的Ubuntu OS中只安装了ncurses-devel包,请尝试安装ncurses-static包。

如果这解决了你的问题,再加上你添加了@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

最新更新