【问题标题】:Undefined reference when using ncurses on linux在 linux 上使用 ncurses 时未定义的引用
【发布时间】:2009-04-30 04:32:04
【问题描述】:

我正在尝试开始在 Linux 上使用 ncurses 开发程序。我什至无法编译 Hello World 示例。代码如下:

#include <curses.h>

int main()
{         
        initscr();
        printw("Hello, world.");
        refresh();
        getch();
        endwin();
        return 0;
}

当我尝试编译时,我得到:

hello.c:(.text+0x12): undefined reference to `initscr'

对于每一个被调用的函数。

我通过 apt-get 安装了 ncurses,也通过下载源代码和编译、安装等方式安装了 ncurses。

#includecurses.hncurses.h 我都试过了。

发生了什么事?

【问题讨论】:

    标签: c linux ncurses


    【解决方案1】:

    您在链接时是否使用了-lcurses 选项?

    包含头文件可以让代码编译(因为编译器从.h 文件中知道函数调用的样子),但链接器需要库文件才能找到实际代码以链接到您的程序。

    【讨论】:

      【解决方案2】:

      正如 Greg Hewgill 所说,您需要传入 -lcurses-lncurses 才能链接到 curses 库。

      gcc -o hello hello.c -lncurses
      

      您可能还想使用initscr()getch()。一旦我进行了这些替换,上面的内容就会为我编译。

      【讨论】:

      • 为什么$ gcc -lncurses -o hello hello.c 不起作用而$gcc -o hello hello.c -lncurses 起作用?
      • @rootkea 因为链接器按照对象在命令行中出现的顺序对对象进行操作。当它首先看到hello 时,它会记住它需要的所有符号,然后当它看到ncurses 库时,它会使用它找到的内容解析这些符号。如果ncurses 先出现,它会看到一堆符号,但会说“我不需要这些符号”并丢弃它们。详情请参阅documentationother SO questsions
      【解决方案3】:

      我遇到了类似的问题,并找到了一个对我有帮助的解决方案,但与此处发布的其他答案略有不同。我试图将面板库与 curses 一起使用,我的编译命令是:

      $ gcc -o hello hello.c -lncurses -lpanel
      

      当我阅读其他答案时,我感到很困惑,因为我 包含了 -lncurses 标志,但它仍然没有编译,并且与您得到的错误类似:

      $ gcc -o hello hello.c -lncurses -lpanel
      /usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libpanel.a(p_new.o): In function `new_panel':
      p_new.c:(.text+0x18): undefined reference to `_nc_panelhook'
      

      我终于在the tldp找到了答案:

      “要使用面板库函数,您必须包含 panel.h 并将程序与面板库链接,标志 -lpanel 应与 -lncurses 按此顺序添加。”

      因此,使用编译标志时,顺序似乎很重要!我尝试切换顺序:

      gcc -o hello hello.c -lpanel -lncurses
      

      这使它能够成功编译。我知道你已经有了答案,所以我希望这对某人有所帮助。

      【讨论】:

        【解决方案4】:

        对于任何有类似问题的人:-lx 参数,其中 x 是您的库,应始终遵循源文件和目标文件。

        【讨论】:

          猜你喜欢
          • 2012-03-21
          • 2023-03-30
          • 1970-01-01
          • 2017-02-14
          • 1970-01-01
          • 2015-06-02
          • 2012-08-30
          相关资源
          最近更新 更多