编译ncurses代码与GCC -lncurses标志似乎不工作

compiling ncurses code with gcc -lncurses flag seems to not be working

本文关键字:工作 标志 -lncurses ncurses 代码 GCC 编译      更新时间:2023-10-16

我正在使用护士编写一个基于终端的俄罗斯方块游戏。我将所有的护士代码分离到一个名为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

我能够使用护士编译一些简短的测试程序。这是我第一次尝试使用护士,也是我第一个重要的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,它的信息文件有很多详细的例子和技巧。