在linux上使用ncurses时未定义的引用

Ali*_*air 10 c linux ncurses

我正在尝试在Linux上使用ncurses开始开发程序.我甚至无法编译Hello World示例.这是代码:

#include <curses.h>

int main()
{         
        initscr();
        printw("Hello, world.");
        refresh();
        getch();
        endwin();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

hello.c:(.text+0x12): undefined reference to `initscr'
Run Code Online (Sandbox Code Playgroud)

对于那些被称为函数的每一个.

我通过apt-get安装了ncurses,还通过下载源代码并编译,安装等.

我已经试过#include这两个curses.hncurses.h.

到底是怎么回事?

Gre*_*ill 15

-lcurses链接时是否使用过该选项?

包含头文件让代码编译(因为编译器知道函数调用从.h文件中看起来是什么样的),但链接器需要库文件来查找链接到程序的实际代码.


Bri*_*ell 12

正如Greg Hewgill所说,你需要传入-lcurses-lncurses链接到curses库.

gcc -o hello hello.c -lncurses
Run Code Online (Sandbox Code Playgroud)

你也可能意味着使用initscr()getch().一旦我进行了这些替换,上面的编译对我来说.

  • @rootkea 因为链接器按照对象在命令行中出现的顺序对对象进行操作。当它首先看到 `hello` 时,它会记住它需要的所有符号,然后当它看到 `ncurses` 库时,它使用它找到的内容解析这些符号。如果 `ncurses` 先出现,它会看到一堆符号,但会说“我不需要这些”并丢弃它们。请参阅 [文档](https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-l-1172) 或 [其他 SO questsions](http://stackoverflow.com/questions/45135 /linker-order-gcc) 了解详情。 (3认同)
  • 为什么 `$ gcc -lncurses -o hello hello.c` 不起作用,而 `$gcc -o hello hello.c -lncurses` 起作用? (2认同)

Kyl*_*ner 5

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

$ gcc -o hello hello.c -lncurses -lpanel
Run Code Online (Sandbox Code Playgroud)

当我看到其他的答案,我感到莫名其妙,因为我包括-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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

gcc -o hello hello.c -lpanel -lncurses
Run Code Online (Sandbox Code Playgroud)

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