1

メイクファイルを作成するように依頼されたので、次のようにしました。

# La siguiente no es necesariamente requerida, se agrega para
# mostrar como funciona.

.SUFFIXES: .o .c
.c.o:
    $(CC) -c $(CFLAGS) $<


# Macros

CC = g++
CFLAGS = -Wall -Wextra -Werror -pedantic
SRC = main.c metbasicos.c metbasicos.h metintermedios.c metintermedios.h metavanzados.c metavanzados.h
OBJ = main.c metbasicos.c metintermedios.c metavanzados.c


# Reglas explicitas

all: $(OBJ)
    $(CC) $(CFLAGS) -o p1 $(OBJ)

clean:
    $(RM) $(OBJ) main

# Reglas implicitas

metbasicos.o: metbasicos.c metbasicos.h
metintermedios.o: metintermedios.c metintermedios.h
metavanzados.o: metavanzados.c metavanzados.h
main.o: main.c metbasicos.h metintermedios.h metavanzados.h

それが正しいか?

コンパイルするには、通常、次のコマンドを使用します。

g++ -Wall -Wextra -Werror -pedantic main.c metbasicos.c metintermedios.c metavanzados.c -o p1.exe

私がいくつかのテストを行う場合:

make ./p1 < input.txt

正常に動作しますが、正しい実装かどうかはわかりません。

私が重大な間違いを犯しているかどうか、誰かが教えてくれますか?

どうもありがとうございました。

4

2 に答える 2

3

ここには重大なエラーはありませんが、奇妙なことがいくつかあります。Ignacio が指摘しているように、コンパイル ルールを再定義したくなければ、実際には再定義する必要はありません。しかし、おそらくそうした理由は、C と C++ を少し混同しているからです。

.c慣例により C コードであるファイルをg++、C++ コンパイラである を使用して構築していますが、これは奇妙です。本当に C コードをビルドしている場合は、 でコンパイルする必要がありますgcc.cpp実際に C++ コードを作成している場合は、ファイルの名前を で終わるように変更する必要があります.cc。また、C++ コンパイラの GNU make 変数はCXX、notCCであり、フラグの変数はCXXFLAGSnotCFLAGSです。

また、allターゲットは依存する必要がp1あり、p1ターゲットにはリンクが含まれている必要があります。

.PHONY: all
all: p1
p1: $(OBJ)
        $(CC) $(CFLAGS) -o p1 $(OBJ)

そうしないと、変更が行われていなくても、p1実行するたびに再リンクされます。make

ヘッダーファイルの前提条件の自動構築など、追加できるその他のより高度なものがあります。

于 2013-10-21T14:56:58.617 に答える
1

$(CFLAGS)コンパイル.cフラグ:ソース ファイルをオブジェクト.oファイルにコンパイルするときに使用されます。

実行時に使用$(CFLAGS)すること$(CC) -o $(OBJ)は一般的ではありませんが、正常に機能します。正しい方法は、バイナリ実行可能ファイルに使用している可能性のあるライブラリを$(LDFLAGS)すべてまとめて、リンクプロセスにフラグを使用することです。.o

通常、$(CFLAGS) には使用するものなどのコンパイル オプションが含まれ、$(LDFLAGS) には makefile と同じディレクトリにある-L. -lpersonal名前のファイルをロードするためのリンク オプションが含まれます。libpersonal.a

また、すでにいくつかある場合は、既存の CFLAGS を保持するために宣言を使用すること+=をお勧めします。CFLAGS

この.c.oルールは、ファイルごとにルールを設定する手間を省きたい場合に便利です。ベスト プラクティスは、ファイルごとにカスタム ルールを定義し、ソース ファイルに含まれるヘッダー ファイルをそのルールの依存関係として追加することです。このように、makefile は、ソースの変更またはインクルードされたヘッダーの変更により、必要なファイルのみを再コンパイルします。もちろん、これにはソース ファイルの徹底的な分析と、ソースに含めるヘッダー ファイルを変更するときの定期的な変更が必要です。

于 2013-10-21T14:56:42.217 に答える