неопределенная ссылка на `stdscr ' - PullRequest
10 голосов
/ 03 марта 2012

Я пытаюсь скомпилировать свой код в 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 ]

17 голосов
/ 30 июня 2012

У меня была эта проблема с программой ncurses на Centos 6.2.Оказывается, что ncurses иногда разделяется на две библиотеки, ncurses и tinfo.В моем случае stdscr существует в libtinfo, а не в libncurses, поэтому добавление -ltinfo к строке ссылки после -lncurses решило проблему.

2 голосов
/ 22 августа 2012

Я знаю, что вы пошли дальше, но для справки в будущем: я думаю, что проблема в размещении аргумента -l.Попробуйте:

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

Для получения дополнительной информации см. Руководство по gcc: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

и этот поток в SO: Размещение опции `-l 'в gcc

1 голос
/ 01 марта 2015

Я столкнулся с той же проблемой при сборке cscope 15.8.

После ./configure я впервые получаю сообщение о том, что "ncurses.h" не найден.Это потому, что на моей ОС не установлена ​​библиотека libncurses-dev.

После установки libcurses-dev я запускаю make напрямую.Затем получили десятки ошибок «неопределенная ссылка на».

После повторного построения с самого начала эти ошибки исчезли.

./configure

make

1 голос
/ 19 марта 2012

user1246043,

У меня была похожая проблема. По сути, я не могу скомпилировать с g ++ 4.5 или g ++ 4.6, поэтому я установил g ++ 4.4 и использовал его. Это определенно решило мою проблему со ссылками на ncursesw.

# Makefile:
CXX=g++-4.4                                                                  
CXXLIBS=-lncursesw                                                           
CXXFLAGS=-Wall
# Other stuff omitted
1 голос
/ 03 марта 2012

Поскольку сообщения об ошибках ссылаются на определенные строки в исходном файле skygrid.cpp, они не являются ошибками компоновщика.

Возможно, вам нужно добавить

#include <curses.h>

в началоэтот исходный файл.

0 голосов
/ 15 января 2015

Я столкнулся с подобной проблемой, когда использовали Qt timer и ncurses: макросы тайм-аута уничтожают код Qt =) Решение было "#undef timeout" после #include <ncurses.h>, чтобы предотвратить работу макросов.И если в некоторых случаях вам понадобится тайм-аут ncurses, вы можете запустить wtimeout(stdscr,delay) напрямую.

...