使用curses.h从键盘获取char

时间:2017-11-01 17:18:10

标签: c gcc linker curses

我试图使用curses.h从键盘上获取一个角色。 这是我的源码(get_char_example.c):

#include <curses.h>
#include <stdio.h>

int main(void)
{
    char ch;

    printf("Enter a character: ");
    ch = getch();
    printf("\nIts ASCII code is %d\n", ch);

    return 0;
}

我使用以下命令编译:

gcc get_char_example.c -o get_char_example

我收到以下错误:

/tmp/ccjaXwRU.o:在函数`main&#39;:

get_char_example.c:(.text+0x1c): undefined reference to `stdscr'
get_char_example.c:(.text+0x24): undefined reference to `wgetch'
collect2: error: ld returned 1 exit status

使用:gcc(GCC)7.2.0 Arch Linux 4.13.9-1-ARCH

提前致谢!

1 个答案:

答案 0 :(得分:2)

这是一个链接器错误(参见this,几乎是重复的)。 pkg-config通常知道ncurses(在需要时提供更多依赖项),因此请尝试编译:

 gcc -Wall -Wextra -g \
    $(pkg-config --cflags ncurses) \
    get_char_example.c \
    $(pkg-config --libs ncurses)

您希望Invoke GCC包含所有警告和调试信息;您可以use GDB,可能在emacsddd下进行调试。

更好的是,使用一些build automation工具(例如makeninja)。 GNU makethis获取灵感来编写Makefile(其中标签 -s很重要)。

在我的Debian Sid上,pkg-config --cflags ncurses提供-D_GNU_SOURCE -D_DEFAULT_SOURCEpkg-config --libs ncurses提供-lncurses -ltinfo,因此只需与-lncurses关联即而不是足够(这就是为什么this今天在2017年11月并不完全重复;几年前与简单-lncurses联系就足够了,今天它不是。)

使用pkg-config --list-all查找pkg-config已知的所有包和库;在开发您的库时,请考虑为其提供一些.pc文件。

顺便说一下,您的程序应该首先使用initscr初始化并使用printw;即使它有点旧,也请阅读Ncurses-programming-HowTo

另请注意,在21 st 世纪中使用ASCII已过时。 程序和计算机使用UTF-8 everywhere ,这会产生深刻的后果,您应该注意(因为UTF-8字符可以跨越几个< / em> bytes)。我的法语键盘具有²§é的键(即使使用美国键盘也可以粘贴它们),这些键都不是ASCII格式。还可以考虑使用像libunistring这样的UTF-8库。