在为PDCurses编译这个示例代码时,为什么只有对endwin()的引用没有定义?

hrirmatl  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(168)

在为PDCurses编译hello-world. c示例时,链接器似乎无法只找到endwin()函数,注解掉包含endwin()的行,代码编译良好,程序运行。
下面是取自here的示例代码(来自source/pdce0.c):

#include <curses.h>

/* hello world, initialize curses */
int main()
{
    initscr();
    printw("Hello World !!!");
    refresh();
    getch();
    endwin();

    return 0;
}

使用mingw 64 shell进行编译时,会抛出以下错误

$ gcc -W -Wall -Ic:/Tools/msys64/mingw64/include/pdcurses -o test hello-world.c -lpdcurses
C:/Tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Tools\msys6
4\tmp\ccsKgZ37.o:hello-world.c:(.text+0x39): undefined reference to `endwin_x64_4302'
collect2.exe: error: ld returned 1 exit status

如上所述,在代码中注解掉endwin()会导致编译没有错误。
我的设置是在Win10上安装MSYS 2,我根据by the MSYS docthis question描述的步骤安装了mingw 64工具链和mingw 64的PDCurses。
我尝试过以不同的方式链接curses库,如-lncurses-llibpdcurses,但这没有帮助。
我尝试了在上面提到的GitHub repo中找到的curses.h,它看起来简单多了,但这一切只是将错误更改为undefined reference to 'endwin'

编辑1条评论

关于endwin()作为宏的内部定义,我在include\pdcurses\curses. h中找到了这一部分

#ifdef PDC_WIDE
   #ifdef PDC_FORCE_UTF8
      #ifdef CHTYPE_32
         #define endwin endwin_u32_4302
      #else
         #define endwin endwin_u64_4302
      #endif
   #else
      #ifdef CHTYPE_32
         #define endwin endwin_w32_4302
      #else
         #define endwin endwin_w64_4302
      #endif
   #endif
#else       /* 8-bit chtypes */
   #ifdef CHTYPE_32
      #define endwin endwin_x32_4302
   #else
      #define endwin endwin_x64_4302
   #endif
#endif

示例库中的curses. h中没有包含类似的定义。
尽管如此,endwin()似乎并没有在lib中定义,我已经尝试过通过pacman重新安装pdcurses包,但这方面似乎一切都很好。
使用另一个MSYS shell或另一个包会有帮助吗?我会看看我能找到什么。

Edit 2我刚刚看了一些其他的例子,发现添加一个无限循环

int main()
{
    initscr();
    printw("Hello World !!!");
    while(1){
       refresh(); 
    }
    getch();
    endwin();

    return 0;
}

编译时也不会出现错误,但当然会生成无响应的程序。
我必须补充一点,我对C语言、编译和其他东西都是新手,所以如果这个问题需要进一步阅读,我很乐意提供建议。

gdx19jrr

gdx19jrr1#

使用#include <pdcurses.h>可以使其编译无误(John Bollinger在他的评论中提到,这是一个方向).我在MSYS 2/MINGW-Packages GitHub上找到了this issue,给人的印象是,我的pdcurses的安装/构建版本可能需要一些关注.就像那里的一个评论者一样,我想,针对pdcurses的链接不需要更改包含的头文件。我将更彻底地研究设置。
但只是为了开始并尝试一些东西,现在一切似乎都很有效。

相关问题