使用gcc -lncurses标志编译ncurses代码似乎无效。

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有关,但我对使用它们还是个新手。

2个回答

4

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

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

好像现在正在编译和链接。但我希望我能说我的程序实际上正在工作,但这是另一个话题。 - Reid A

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

一些解释: $@ 是正在构建的内容,$< 是第一个依赖项,$^ 是所有的依赖项。恰当地使用这些变量可以减少打字(和更少的愚蠢错误,比如添加了一个依赖但没有处理它; 或省略了一个依赖项(因此在其更改时不重新构建))。如果你使用GNU make,请查看make手册,它的 info 文件中有许多详细的示例和提示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接