使用gcc -Incurses标志编译ncurses代码似乎不起作用

问题描述 投票:3回答:2

我正在使用ncurses编写基于终端的俄罗斯方块游戏。我已经将所有ncurses代码隔离到一个名为tetrisUI.c的文件中,该文件在main.c源文件中包括一个头文件。当我编译所有的ncurses函数时,都会引发编译器错误。我已经在源文件中包含了ncurses.h,并且在gcc中使用了-Incurses标志。我正在从具有以下内容的makefile进行编译:

Tetris : tetris.o main.o tetrisUI.o
    gcc tetris.o main.o tetrisUI.o -o Tetris

tetrisUI.o : tetrisUI.c
    gcc -std=c99 -c tetrisUI.c -lncurses

tetris.o : tetris.c tetris.h
    gcc -std=c99 -c tetris.c

main.o : main.c tetris.h tetrisUI.h
    gcc -std=c99 -c main.c

我能够使用ncurses编译一些简短的测试程序,就很好了。这是我第一次尝试使用ncurses和我的第一个重要的c程序(我在学校里做了一点c ++)。我有一个预感,我的问题与我的makefile有关,但是我也不喜欢使用它们。

c++ c linux gcc ncurses
2个回答
3
投票

在链接阶段而不是在编译阶段使用-lncurses

gcc tetris.o main.o tetrisUI.o -o Tetris -lncurses

2
投票

您可以使用默认的宏和规则来简化Makefile:

CFLAGS = -std=c99   # C compiler flags
LDLIBS = -lcurses   # curses

Tetris : tetris.o main.o tetrisUI.o  # make does a "$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS)" on its own

这就是您所需要的。以下定义和规则可以完全省略-默认情况下,make做正确的事情:

CC     = gcc        # C compiler name

tetrisUI.o : tetrisUI.c  tetrisUI.h # make does a "$(CC) $(CFLAGS) -o $@ $<" on its own

tetris.o : tetris.c tetris.h

main.o : main.c tetris.h tetrisUI.h

一点解释:$@是正在构建的东西,$<是第一个依赖项,$^是所有依赖项。明智地使用它可以减少键入操作(减少傻瓜错误,在其中添加依赖项并且不对其进行处理;或者忽略依赖项(因此,如果更改则不要重做))。看一下make手册,如果您有GNU make,它的信息文件包含许多详细的示例和技巧。

© www.soinside.com 2019 - 2024. All rights reserved.