2012-03-02 3 views
7

Я пытаюсь скомпилировать свой код в Ubuntu 11.10 и получить эти ошибки и многое другое. Далеко за счет googling я думаю, что это ошибка связи. В частности, были предложения, чтобы убедиться, что у вас есть правильные заголовки и связать библиотеку -lncurses. Я уже это сделал. Я все еще получаю эту ошибку. Я также читал, что может быть, я должен установить libncurses, но я уже установил его.undefined ссылка на `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. –

+1

Спасибо всем, кто пытался помочь. Я больше не работаю с этим кодом, и у меня нет доступа к нему. Итак, я не пробовал ничего, кроме того, что предложил Кейт Томпсон, и это не сработало для меня. Для других, кто может столкнуться с одной и той же проблемой, попробуйте другие ответы и отметьте их полезными, если они так. – Fari

+1

У меня была такая же проблема, и исправление должно было использовать -l в конце: 'gcc -o hello hello.c -lncurses' – jcubic

ответ

1

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

Вы, вероятно, нужно добавить

#include <curses.h> 

в верхней части этого исходного файла.

+0

Спасибо за ваш ответ. У меня уже есть #include в моем файле. Этот код компилируется и уже запущен на других компьютерах с более старой версией Ubuntu и Mac (забыли точно os), просто не на моем компьютере с Ubuntu 11.10. – Fari

+0

Нечетные. У меня нет ваших источников, но я собрал небольшой пример на своей собственной системе Ubuntu 11.04, и он работает. https://gist.github.com/1968401 –

+0

Спасибо, я ценю вашу помощь. Я попробую ваш пример кода на моем компьютере, когда у меня появится шанс, и я дам вам знать, работает ли он. – Fari

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 ... –

13

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

+1

Мне не хватало только флаг -lncurses. не понял бы этот пост :) – simgineer

2

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

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

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

и эта нить на SO: Placement of `-l' option in gcc

0

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

1

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

После ./configure, я сначала получаю сообщение об ошибке «ncurses.h» не найден. Это потому, что libscurses-dev не установлен на моих os.

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

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

./configure

make

+0

haha ​​... Работал и для меня – RootPhoenix