11

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

到底是怎么回事?

4

4 回答 4

16

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

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

于 2009-04-30T04:36:07.947 回答
14

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

gcc -o hello hello.c -lncurses

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

于 2009-04-30T04:40:41.880 回答
8

我遇到了类似的问题,并找到了一个对我有帮助的解决方案,但与此处发布的其他答案略有不同。我试图将面板库与 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'

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

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

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

gcc -o hello hello.c -lpanel -lncurses

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

于 2013-03-28T01:11:08.117 回答
4

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

于 2012-06-19T07:09:19.843 回答