微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ncurses 库时,程序无法通过 Makefile 编译?

如何解决使用 ncurses 库时,程序无法通过 Makefile 编译?

我正在尝试使用 ncurses 库制作程序,但是由于某种原因,当我尝试使用我的 Makefile 进行编译时,它说 Makefile 中存在错误,并且 ncurses 中的所有函数都未定义。我正确地将库包含在 main.c 文件中,因为当我使用 gcc main.c -lncurses 进行编译时,程序可以正常工作并且没有给出任何错误或说任何未定义的内容。我试过弄乱 Makefile,但无法正常工作,有人有解决方案吗?

生成文件

CC = gcc
CFLAGS = -Wall --std=c99 -g
LDFLAGS = -lncurses
OBJECTS = main.o
ALL: space_invaders
space_invaders: $(OBJECTS)
        $(CC) $(CFLAGS) -o space_invaders $(OBJECTS)
main.o: main.c
        $(CC) $(CFLAGS) -c main.c -o main.o
clean:
        rm space_invaders $(OBJECTS)

输出

gcc -Wall --std=c99 -g -o space_invaders main.o /usr/bin/ld: main.o: 在函数 main': /home/kyle/space_invaders/main.c:9: undefined reference to initscr' 中 /usr/bin/ld: /home/kyle/space_invaders/main.c:10: 对 noecho' /usr/bin/ld: /home/kyle/space_invaders/main.c:11: undefined reference to curs_set' 的未定义引用 /usr/bin/ld: /home/kyle/space_invaders/main.c:22: 对 stdscr' /usr/bin/ld: /home/kyle/space_invaders/main.c:22: undefined reference to stdscr' 的未定义引用 /usr/bin/ld: /home/kyle/space_invaders/main.c:22: 对 stdscr' /usr/bin/ld: /home/kyle/space_invaders/main.c:22: undefined reference to stdscr' 的未定义引用 /usr/bin/ld: /home/kyle/space_invaders/main.c:23: 对 stdscr' /usr/bin/ld: /home/kyle/space_invaders/main.c:23: undefined reference to wclear' 的未定义引用 /usr/bin/ld: /home/kyle/space_invaders/main.c:24: 对 mvprintw' /usr/bin/ld: /home/kyle/space_invaders/main.c:25: undefined reference to stdscr' 的未定义引用 /usr/bin/ld: /home/kyle/space_invaders/main.c:25: 对 `wrefresh' 的未定义引用 collect2: 错误: ld 返回 1 个退出状态 make: *** [Makefile:7: space_invaders] 错误 1

解决方法

LDFLAGS 已定义但未使用。将其添加到链接最终可执行文件的规则中。

space_invaders: $(OBJECTS)
    $(CC) $(CFLAGS) -o space_invaders $(OBJECTS) $(LDFLAGS)

或者,可以使用 Make 隐式规则来简化 makefile:

CC = gcc
CFLAGS = -Wall --std=c99 -g
LDFLAGS = -lncurses
OBJECTS = main.o
ALL: space_invaders

space_invaders: $(OBJECTS)

clean:
        rm space_invaders $(OBJECTS)
,

您必须在链接命令中指定 $(LDFLAGS) 变量:

space_invaders: $(OBJECTS)
        $(CC) $(CFLAGS) $(LDFLAGS) -o space_invaders $(OBJECTS)

您可能已经看到,运行输出中的链接命令没有显示 -lncurses 选项,因此库没有包含在内,从而导致对库函数的所有调用都无法解析。

我不建议您使用另一个关于使用隐式链接规则的答案中给出的替代方法,因为它仅适用于 GNU make,因此,它不能移植到周围的其他 make 中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。