【问题标题】:ncursesw functions not declaredncursesw 函数未声明
【发布时间】:2020-01-29 16:12:01
【问题描述】:

我需要使用支持 unicode 的 ncurses,所以我在我的 .c 文件中加入了以下行。

#include <curses.h>

在我的 makefile 中,我使用 -lncursesw 作为标志。当调用像 get_wch() 这样的函数时,它告诉我“函数的隐式声明”。我在 Arch Linux 上,所以我用 pacman -S ncurses 安装了 ncurses。在 /usr/include 我可以找到 cursesw.h,但它没有声明 get_wch() 之类的函数。在/lib下可以找到libcursesw.so,怎么回事?

【问题讨论】:

  • 尝试安装 ncursesw(宽)包
  • 不要描述代码和错误信息。相反,将代码(以minimal reproducible example 的形式)和错误消息(完全正确!)添加到问题帖子中。见How to Ask
  • /usr/include/ncursesw/吗?

标签: c linux ncurses archlinux


【解决方案1】:

-lncursesw 是一个 linker 标志,其本身不足以启用宽字符支持。您还应该添加 compiler 标志-I/usr/include/ncursesw。如果没有这个,你的#include <curses.h> 最终会包含/usr/include/curses.h 而不是/usr/include/ncursesw/curses.h

如果您想要一种更标准的方法来找出所需的链接器和编译器标志,您可以使用pkg-config。查看它们之间的区别:

$ pkg-config ncurses --cflags --libs
-D_GNU_SOURCE -D_DEFAULT_SOURCE -lncurses -ltinfo

$ pkg-config ncursesw --cflags --libs
-D_GNU_SOURCE -D_DEFAULT_SOURCE -I/usr/include/ncursesw -lncursesw -ltinfo

【讨论】:

    【解决方案2】:

    使用<curses.h>,阅读头文件看看你喜欢使用哪个定义:

    /* 
     * With XPG4, you must define _XOPEN_SOURCE_EXTENDED, it is redundant (or 
     * conflicting) when _XOPEN_SOURCE is 500 or greater.  If NCURSES_WIDECHAR is   
     * not already defined, e.g., if the platform relies upon nonstandard feature   
     * test macros, define it at this point if the standard feature test macros 
     * indicate that it should be defined. 
     */
    #ifndef NCURSES_WIDECHAR
    #if defined(_XOPEN_SOURCE_EXTENDED) || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 >= 500))
    #define NCURSES_WIDECHAR 1
    #else  
    #define NCURSES_WIDECHAR 0
    #endif
    #endif /* NCURSES_WIDECHAR */
    

    (只需NCURSES_WIDECHAR 就足够了)。 manual page对此进行了总结。

    如果您阅读cursesw.h,您可能会注意到它是针对 C++ 绑定的。

    正如另一个答案中所建议的,您可以从 pkg-config 程序中获得一些帮助。但是,对于 Arch Linux,这给出了不同的结果:

    $ pkg-config ncurses --cflags --libs
    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -lncursesw 
    $ pkg-config ncursesw --cflags --libs
    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -lncursesw 
    

    也就是说,Arch Linux 打包器已经将 ncurses 的两种配置等同起来; pkg-config 中的两个选择都使用 ncursesw 库。 Arch Linux 软件包确实有一个libncurses.so,但这只是一个告诉链接器使用libncursesw.so 的文本文件。由于它的打包方式,在 Arch Linux 上,你使用哪个库没有区别。

    (顺便说一句,结合_GNU_SOURCE_DEFAULT_SOURCE 是不正确的,可能不是来自任何发行版的打包系统,因为前者在ncurses five years ago 中已被弃用。

    【讨论】:

    • 我尝试定义 _XOPEN_SOURCE_EXTENDED 或 NCURSES_WIDECHAR 或定义 _XOPEN_SOURCE 的值大于 500,但它仍然不起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 2018-10-27
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多