【问题标题】:Undefined reference to `stdscr' while using ncurses使用 ncurses 时对“stdscr”的未定义引用
【发布时间】:2023-07-10 07:32:01
【问题描述】:

我正在尝试在 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'

【问题讨论】:

  • 约定是使用 CPP 作为预处理器,CPPFLAGS 作为预处理器的标志,CXX 用于 C++ 编译器,CXXFLAGS 作为 CXX 的标志。将 CPP 分配为 C++ 编译器会破坏 make 的隐式规则。
  • 感谢所有试图提供帮助的人。我实际上不再使用此代码,也无权访问它。所以,除了 Keith Thompson 的建议之外,我没有尝试任何其他方法,而这对我没有用。对于可能遇到相同问题的其他人,请尝试其他答案并标记它们是否有用。
  • 我遇到了同样的问题,解决方法是在最后使用 -l:gcc -o hello hello.c -lncurses

标签: c++ compilation linker ncurses


【解决方案1】:

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

【讨论】:

  • 我只缺少了 -lncurses 标志。不会在这篇文章中发现它:)
【解决方案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

【讨论】:

    【解决方案3】:

    user1246043,

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

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

    【讨论】:

      【解决方案4】:

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

      你可能需要添加

      #include <curses.h>
      

      到那个源文件的顶部。

      【讨论】:

      • 感谢您的回复。我的文件中已经有#include 。此代码正在编译并已在其他具有旧版本 Ubuntu 的计算机和 Mac 上运行(忘记确切的操作系统),只是不在我的 Ubuntu 11.10 计算机上。
      • 奇数。我没有你的资源,但我在自己的 Ubuntu 11.04 系统上放了一个小例子,它可以工作。 gist.github.com/1968401
      • 谢谢,感谢您的帮助。有机会我会在我的电脑上尝试你的示例代码,如果它有效,我会告诉你。
      • 嗨,我试过你的代码,但我仍然得到同样的未定义引用错误。 fari@ubuntu:~/Desktop/test$ make g++ -c -Wall -g skygrid.cpp -o skygrid.o g++ -lpthread -lncurses -o skygrid skygrid.o skygrid.o: 在函数main': /home/fari/Desktop/test/skygrid.cpp:4: undefined reference to stdscr' collect2: ld 返回 1 个退出状态 make: *** [skygrid] Error 1 fari@ubuntu:~/Desktop/test$
      【解决方案5】:

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

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

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

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

      ./configure

      make

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 由于某种原因,我得到了同样的错误。 undefined reference to stdscr; undefined reference to wgetch