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