对`stdscr'的未定义引用

时间:2012-03-02 23:11:56

标签: c++ compilation linker

我正在尝试在Ubuntu 11.10中编译我的代码并获得更多这些错误。到目前为止谷歌搜索它我认为这是一个链接错误。具体来说,有建议确保您拥有正确的标头并链接-lncurses库。我已经这样做了。我还是得到了这个错误。我还读到可能是我应该安装libncurses,但我已经安装了它。

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 $@ $^

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'

6 个答案:

答案 0 :(得分:17)

我在Centos 6.2上使用ncurses程序遇到了这个问题。事实证明,ncurses有时会分为两个库,ncursestinfo。就我而言,stdscr中存在libtinfo,而不存在于libncurses中,因此在-ltinfo之后将-lncurses添加到链接行,解决了问题。

答案 1 :(得分:2)

我知道你已经继续前进了,但是为了将来的参考:我的猜测是问题出在-l参数的位置。尝试:

skygrid: skygrid.o commServer.o pose.o robot.o
    $(LINK) -o $@ $^ $(LDFLAGS)

有关更多信息,请参阅gcc手册: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

和SO上的这个帖子: Placement of `-l' option in gcc

答案 2 :(得分:1)

由于错误消息引用了skygrid.cpp源文件中的特定行,因此它们不是链接器错误。

您可能需要添加

#include <curses.h>

到该源文件的顶部。

答案 3 :(得分:1)

user1246043,

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

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

答案 4 :(得分:1)

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

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

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

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

./configure

make

答案 5 :(得分:0)

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