3

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

4

2 回答 2

4

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

gcc tetris.o main.o tetrisUI.o -o Tetris -lncurses
于 2012-12-22T01:17:47.950 回答
3

您可以使用默认的宏和规则来简化您的 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,它的 info 文件有很多详细的例子和提示。

于 2013-01-20T05:10:46.790 回答