【问题标题】:program wont compile via Makefile when using ncurses library?使用 ncurses 库时程序不会通过 Makefile 编译?
【发布时间】:2023-04-05 04:18:02
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 请不要将代码和文本输出作为图像发布 - reasoning。将其作为格式化文本复制到问题中。
  • makefile 定义了LDFLAGS 但从不使用它。
  • @kaylum 我会在makefile的什么地方使用它?我尝试查找它,但无法弄清楚它会在哪里使用。
  • 好吧,如果您手动构建它,您在哪里添加该标志?将它放在与同一命令对应的 Makfile 中的位置。也就是说,将其添加到链接最终可执行文件的命令中。
  • @kaylum 谢谢,我把它放在那里,它现在可以正常工作了。

标签: c linux windows makefile ncurses


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-10
      • 2012-05-02
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多