我正在尝试在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,并通过下载源代码和编译,安装等来安装。
我已尝试#include
curses.h
和ncurses.h
。
发生了什么事?
答案 0 :(得分:13)
链接时是否使用过-lcurses
选项?
包含头文件让代码编译(因为编译器知道函数调用从.h
文件中看起来是什么样的),但链接器需要库文件来查找链接到程序中的实际代码。
答案 1 :(得分:12)
正如Greg Hewgill所说,你需要传递-lcurses
或-lncurses
来链接到curses库。
gcc -o hello hello.c -lncurses
您也可能想要使用initscr()
和getch()
。一旦我进行了这些替换,上面的内容就会为我编译。
答案 2 :(得分:4)
对于有类似问题的人:-lx参数,其中x是你的库,应该始终遵循源文件和目标文件。
答案 3 :(得分: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
这允许它成功编译。我知道你已经有了答案,所以我希望这可以帮助别人。