2012-03-02 176 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