使用gcc -lncurses标志编译ncurses代码似乎无法正常工作

时间:2012-12-22 01:16:02

标签: c++ c linux gcc ncurses

我正在使用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有关,但我也是使用它们的菜鸟。

2 个答案:

答案 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,它的信息文件有很多详细的例子和提示。