2012-03-02 30 views
7

我想在Ubuntu 11.10中编译我的代码并获取这些错误和更多。到目前为止,通过使用Google搜索,我认为这是一个链接错误。具体来说,有一些建议要确保你有正确的标题并链接-lncurses库。我已经做到了。我仍然收到这个错误。我也读过,可能是我应该安装libncurses,但我已经安装它。对`stdscr'的未定义引用

My MakeFile: 
CPP   = g++ 
CPPFLAGS  = -c -Wall -g 
LINK   = g++ 
LDFLAGS_LINUX = -lpthread -lncurses 
LDFLAGS  = $(LDFLAGS_LINUX) 
RM   = rm 


.SUFFIXES: 
.SUFFIXES: .o .cpp 

.cpp.o: 
    $(CPP) $(CPPFLAGS) $*.cpp -o $(SRC_DIR)$*.o 

all: skygrid 

skygrid: skygrid.o commServer.o pose.o robot.o 
    $(LINK) $(LDFLAGS) -o [email protected] $^ 

clean: 
    $(RM) -rf *.o skygrid 

skygrid.o: skygrid.cpp definitions.h commServer.h pose.h robot.h 
commServer.o: commServer.cpp commServer.h 
pose.o:  pose.cpp pose.h 
robot.o: robot.cpp robot.h pose.h 

我的错误:

/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1094: undefined reference to `stdscr' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1094: undefined reference to `stdscr' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1094: undefined reference to `stdscr' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1094: undefined reference to `stdscr' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1104: undefined reference to `werase' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1106: undefined reference to `wprintw' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1107: undefined reference to `wprintw' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1109: undefined reference to `wprintw' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1111: undefined reference to `stdscr' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1111: undefined reference to `wgetch' 
/home/fari/Desktop/FarahSkygrid/skygrid/src/skygrid.cpp:1116: undefined reference to `wtouchln' 
+0

的惯例是使用CPP为预处理器,如CPPFLAGS国旗的预处理器,用于CXX C++编译器,以及用于CXXFLAGS标志来CXX。将CPP分配为C++编译器将会破坏make的隐式规则。 – 2012-03-02 23:19:44

+1

感谢所有试图帮助的人。我实际上不再使用这段代码,也无法访问它。所以,除了Keith Thompson的建议,我没有尝试任何其他方法,这对我没有任何作用。对于其他可能遇到同样问题的人,请尝试其他答案,并将其标记为有用的,如果他们是这样的话。 – Fari 2012-07-09 01:27:50

+1

我遇到了同样的问题,修复方法是在最后使用-l:'gcc -o hello hello.c -lncurses' – jcubic 2014-06-16 15:51:26

回答

1

由于错误引用具体线路在skygrid.cpp源文件,他们没有链接错误。

你可能需要

#include <curses.h> 

添加到源文件的顶部。

+0

谢谢您的回复。我已在文件中包含#include 。这段代码正在编译,并且已经运行在其他旧版Ubuntu和Mac上的计算机上(忘记了确切的操作系统),而不是在我的电脑上使用Ubuntu 11.10。 – Fari 2012-03-03 21:23:35

+0

奇数。我没有你的资源,但我在我自己的Ubuntu 11.04系统上放了一个小例子,它可以工作。 https://gist.github.com/1968401 – 2012-03-03 21:42:02

+0

谢谢,我感谢你的帮助。当我有机会时,我会在计算机上试用您的示例代码,如果它有效,我会通知您。 – Fari 2012-03-03 23:56:19

1

user1246043,

我一直有类似的问题。基本上,我无法编译g ++ 4.5或g ++ 4.6,所以我安装了g ++ 4.4并使用它。这特别解决了我与链接到ncursesw的问题。

# Makefile: 
CXX=g++-4.4                 
CXXLIBS=-lncursesw               
CXXFLAGS=-Wall 
# Other stuff omitted 
+0

谢谢@baffled ... – 2014-10-16 07:02:17

13

我在使用CentOS 6.2上的ncurses程序时遇到了这个问题。事实证明,ncurses有时会分成两个库,ncurses和tinfo。在我的情况下,stdscr存在于libtinfo中,而不是libncurses中,所以在-lncurses之后将-ltinfo添加到链接行中解决了这个问题。

+1

我错过了-lncurses标志。不会想出来这个职位:) – simgineer 2012-11-26 02:16:17

0

我面临着类似的问题,当使用Qt的定时器和ncurses的:超时宏废除Qt代码=) 解决方案是在#include <ncurses.h>之后的"#undef timeout"以防止宏运行。如果在某些情况下您需要ncurses超时,则可以直接运行wtimeout(stdscr,delay)

1

我在构建cscope 15.8时遇到了同样的问题。

./configure之后,我首先得到错误,说没有找到“ncurses.h”。这是因为我的操作系统上没有安装libncurses-dev。

安装libcurses-dev后,我直接运行make。然后得到了几十个“未定义的参考”错误。

重新开始重建后,这些错误消失了。

./configure

make

+0

哈哈...也为我工作 – RootPhoenix 2015-06-05 07:17:32