我正在运行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'
我通过在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。任何帮助将不胜感激。
P.S。我不知道这是否重要但是当我尝试运行/ usr / bin / ld时出现此错误:
ld: fatal error: no input files
答案 0 :(得分:45)
对于遇到同样问题的人:我错过了32位库;我在64位服务器上编译32位,缺少lib32ncurses5-dev软件包。
在Ubuntu上我只是跑了:
sudo apt-get install lib32ncurses5-dev
答案 1 :(得分:2)
首先,您应该在链接时将库放在目标文件之后。在源文件的编译中根本没有它们。
之后,如果ncurses未安装在标准搜索文件夹中,则需要指向链接器所在的位置,这是通过-L
命令行选项完成的:
gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
答案 2 :(得分:1)
如果您的Ubuntu操作系统中只安装了ncurses-static
软件包,请尝试安装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
可以解决您的问题。
FYI。
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