3

ncurses を使用して端末ベースの Tetris ゲームを作成しています。すべての ncurses コードを tetrisUI.c という名前のファイルに分離し、このファイルのヘッダー ファイルを main.c ソース ファイルに含めました。すべての ncurses 関数をコンパイルすると、コンパイラ エラーが発生します。ソース ファイルに ncurses.h を含め、gcc で -lncurses フラグを使用しています。次の内容のメイクファイルからコンパイルしています。

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

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 に答える