我正在使用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有关,但是我也不喜欢使用它们。
在链接阶段而不是在编译阶段使用-lncurses
:
gcc tetris.o main.o tetrisUI.o -o Tetris -lncurses
您可以使用默认的宏和规则来简化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,它的信息文件包含许多详细的示例和技巧。