Windows下通过makefile编译curses项目提示__imp_stdscr未定义错误
问题原因分析
- 你使用的Msys2 Mingw64环境下,ncurses头文件默认会优先使用动态链接的符号导入规则,没有定义
NCURSES_STATIC宏的情况下,所有ncurses导出符号都会加__imp_前缀,和静态ncurses库导出的符号不匹配,就会出现本次遇到的链接错误。 - 部分Mingw环境默认只提供宽字符版本的ncurses库,库名为
libncursesw.a,用原Makefile里的-lncurses无法正确链接到库文件。
解决方案步骤
- 首先安装必要的依赖包
打开Mingw64终端,执行以下命令安装ncurses开发包:
pacman -S mingw-w64-x86_64-ncurses
- 清理之前的编译缓存
执行make clean删除之前生成的.o文件和可执行文件,避免旧缓存影响编译结果。 - 修改Makefile配置
修改后的Makefile内容如下:
CFLAG = -Wall -pedantic -Wno-comment -O3 -std=c89 -DNCURSES_STATIC all: pong pong_log game.o: game.h game.c gcc $(CFLAG) -c game.c display.o: display.h display.c gcc $(CFLAG) -c display.c pong: game.h display.h game.o display.o main.c gcc $(CFLAG) display.o game.o main.c -o pong -lncursesw pong_log: game.h display.h game.o display.o main.c gcc $(CFLAG) -D REG display.o game.o main.c -o pong_log -lncursesw clean: rm -rf *.o pong pong_log
修改点说明:
- CFLAG新增
-DNCURSES_STATIC宏定义,强制使用静态ncurses库的符号规则 - 链接参数将
-lncurses替换为-lncursesw,适配Mingw下的宽字符ncurses库
- 重新执行
make命令编译即可。
如果修改后还有链接错误,可以尝试在链接参数末尾额外加上-ltinfo,部分环境下ncurses依赖tinfo库。
内容的提问来源于stack exchange,提问作者pietro ventrucci
相关产品推荐
相关产品推荐

