在为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 doc和this 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语言、编译和其他东西都是新手,所以如果这个问题需要进一步阅读,我很乐意提供建议。
1条答案
按热度按时间gdx19jrr1#
使用
#include <pdcurses.h>
可以使其编译无误(John Bollinger在他的评论中提到,这是一个方向).我在MSYS 2/MINGW-Packages GitHub上找到了this issue,给人的印象是,我的pdcurses
的安装/构建版本可能需要一些关注.就像那里的一个评论者一样,我想,针对pdcurses
的链接不需要更改包含的头文件。我将更彻底地研究设置。但只是为了开始并尝试一些东西,现在一切似乎都很有效。