33

我正在运行 Ubuntu 12.04,我目前正在从事一个涉及 C、OpenGL、茶壶和输入法的项目。

当我决定将箭头键作为输入时,问题就开始了。我检查了箭头键的键码,但所有箭头都返回 0。我查找了如何使它工作,我找到了 conio.h。不幸的是,它是一个旧的 DOS 头文件,不适用于 Linux。然后我找到了一个叫做 ncurses 的替代品。

安装必要的库后,通过密切遵循构建说明,我在 main.c 源代码中添加了 #included 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'

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

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

以及之前的错误。

在过去的 2 天里,我一直在搜索 Ubuntu 论坛和 StackOverFlow。任何帮助,将不胜感激。

PS 我不知道这是否重要,但是当我尝试运行 /usr/bin/ld 时出现此错误:

ld: fatal error: no input files
4

3 回答 3

49

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

在 Ubuntu 上,我只是运行:

sudo apt-get install lib32ncurses5-dev
于 2015-01-07T17:10:13.480 回答
2

首先,链接时应该将库放在目标文件之后。并且在源文件的编译中根本没有它们。

之后,如果 ncurses 未安装在标准搜索文件夹中,您需要指出它所在的链接器,这是通过-L命令行选项完成的:

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
于 2013-01-19T16:50:04.683 回答
2

ncurses-static如果您ncurses-devel的 Ubuntu 操作系统中只安装了该软件包,请尝试安装该软件包。

如果这解决了您的问题,再加上您添加了@Joachim 的编译说明,那么您将有了一个良好的开端。

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

链接器在其搜索路径中找不到您的共享库。如果您将共享库所在的目录添加到LD_LIBRARY_PATH环境变量中,链接器应该会找到它并能够链接到它。在这种情况下,您可以省略-Lgcc 的选项:

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
于 2013-01-19T17:00:48.153 回答