我正在使用ncurses编写基于终端的俄罗斯方块游戏。我已将所有ncurses代码隔离到一个名为tetrisUI.c的文件中,我在main.c源文件中包含了一个头文件。当我编译所有ncurses函数时引发编译错误。我在源文件中包含了ncurses.h,我在gcc中使用了-lncurses标志。我正在使用以下内容从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有关,但我也是使用它们的菜鸟。
答案 0 :(得分:3)
在链接阶段使用-lncurses
而不是在编译阶段:
gcc tetris.o main.o tetrisUI.o -o Tetris -lncurses
答案 1 :(得分:1)
您可以使用默认宏和规则来简化Makefile:
CC = gcc # C compiler name
CFLAGS = -std=c99 # C compiler flags
Tetris : tetris.o main.o tetrisUI.o
$(CC) $(CFLAGS) -o $@ $^ -lncurses
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
一点解释:$@
是正在构建的内容,$<
是第一个依赖项,$^
就是所有这些依赖项。明智地使用这种方法可以减少打字(并减少愚蠢的错误,在这种情况下,您可以添加依赖项并且不处理它;或者省略依赖项(因此如果更改,则不会重做构建))。看看制作手册,如果你有GNU make,它的信息文件有很多详细的例子和提示。