3

私はMakefileを読んでいますが、次のコマンドをMakefileに書き込む方法についてはまだわかりません。

gcc -std=c89 A.c -c
gcc -std=c89 B.c -c
gcc -std=c89 C.c -c
gcc -std=c89 A.o B.o -o A
gcc -std=c89 C.o B.o -o C

AとCはBに依存していますが、別々のプログラムです。

これは私が思いついたもので、機能しません:

CC = gcc -std=c89
FILES = A.c B.c C.c
OUT = out
build: $(FILES)
    $(CC) -o $(OUT) $(Files)
clean:
    rm -f *.o core
4

4 に答える 4

3

これはギミックのないmakefileであり、gccとrmの前にあるものは「タブ」文字でなければならず、スペースではありません。

all: A C

A.o: A.c
    gcc -std=c89 -c A.c

B.o: B.c
    gcc -std=c89 -c B.c

C.o: C.c
    gcc -std=c89 -c C.c

A: A.o B.o
    gcc -std=c89 -o A A.o B.o

C: C.o B.o
    gcc -std=c89 -o C C.o B.o

clean:
    rm A C a.o b.o c.o core
于 2012-04-10T16:50:11.333 に答える
2

これを試して:

X1 = A
O1 = A.o B.o

X2 = B
O2 = C.o B.o

DBGFLAGS = -g -O0
CFLAGS = -W -Wall $(DBGFLAGS)

all: $(X1) $(X2) 

$(X1): $(O1)
        $(CC) $(LDFLAGS) -o $@ $(O1) $(LIBS)

$(X2): $(O2)
        $(CC) $(LDFLAGS) -o $@ $(O2) $(LIBS)

.PHONY: clean

clean:
        rm -f $(X1) $(O1) $(X2) $(O2) *~

コピーペーストでうまくいかない場合は、8つのスペースを1つのタブに変更してください。

于 2012-04-10T16:37:47.157 に答える
2

makefileを作成するときは、通常、最後から始めて、最初に向かって進みます。あなたは最終製品から始めて、それを出発点からどのように生産するかについての規則を与えます。

この場合、2つの最終製品があるようです:AC

all: A C

コマンドラインでターゲットを指定しない場合、makeはmakefileに表示される最初のターゲットをビルドします。したがって、これをファイルの最初のターゲットとして、その下に他のターゲットを配置する必要があります。これをツリーと考えると、これがツリーのルートであり、以下の各アイテムはそのツリーのブランチです。

このルートの下に含まれていないセカンダリターゲットを定義することもできます。たとえば、多くの(ほとんど?)makefileには、cleanビルド中に作成されるすべての中間ファイルを削除するという名前のターゲットが含まれています。これは、コマンドとして発行するだけの一部としてではなく、ユーザーが呼び出す場合にのみ使用されます。make cleanmake

とにかく、次に、それらのそれぞれが何に依存しているか、そしてそれが何に依存しているかからそれを作成する方法についてそれを伝えます:

A: A.o B.o
    $(CC) -o A A.o B.o

C: B.o C.o
    $(CC) -o B B.o C.o

次に(必要に応じて、ここにはありません)、各.oファイルがファイルにどのように依存しているかを説明し.cます。ただし、Gmakeには(既存のほぼすべてのmakeツールと同様に)、CまたはC++ファイルをコンパイルして一致するオブジェクトファイルを生成する方法を指示するルールが組み込まれています。これらは、makefileの上部に次のようなものが含まれているようなものになります。

CC = gcc

.c.o:
    $(CC) $(CFLAGS) -c $*.c

これにより、CFLAGSの現在の値がフラグとしてコンパイラに渡されるため、必要なフラグに設定する必要があります。この場合は、次のようになります。

CFLAGS = -std=c89

通常、これをmakefileの先頭に配置し、通常は任意のターゲットの前に配置します。

これは、makefileで実行できるすべてのことをカバーすることすらできないことを付け加えておきます。たくさんのファイルを扱うときに本当に便利なショートカットはたくさんありますが、ソースファイルが3つしかない場合はあまり役に立ちません。

于 2012-04-10T16:54:07.367 に答える
1

GNU makeを使用すると仮定すると、ほとんどの場合、組み込みのルールに依存できます。

CFLAGS = -std=c89
LDFLAGS = -std=c89
A: A.o B.o
C: C.o B.o

これにより、リストしたコマンドが実行されます。しかし、それは掃除やそのようなものを気にしません。ただし、必ずしもそれが必要なわけではありません。makeプログラムは、再コンパイル/再リンクが必要なときにそれを認識し、自動的に行います。

于 2012-04-10T16:37:16.093 に答える