2012-04-10 10 views
3

私はMakefileを読んできましたが、次のコマンドを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に依存しますが、別々のプログラムです。

これは私が仕事をdoesntのどの思い付いたものです:

あなたは主に組み込みルールに頼ることができる、あなたは GNU makeを使用すると仮定すると、
CC = gcc -std=c89 
FILES = A.c B.c C.c 
OUT = out 
build: $(FILES) 
    $(CC) -o $(OUT) $(Files) 
clean: 
    rm -f *.o core 

答えて

3

これはgymicksメイクファイルではありません。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 
1

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

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

+0

「ake:致命的なエラー:ターゲットを作る方法が分からない」Bo –

+1

「%.o:%.c [ENTER] [TAB] gcc -o $ @ $ <'somewhere :-) – Gui13

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 [email protected] $(O1) $(LIBS) 

$(X2): $(O2) 
     $(CC) $(LDFLAGS) -o [email protected] $(O2) $(LIBS) 

.PHONY: clean 

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

変更8つのスペースを一つのタブにコピーペーストがそれをしない場合。

2

メイクファイルを書き込むときは、通常、最後から始めて、最初に向かって作業します。あなたは最終製品から出発し、出発点からそれを作り出す方法についてのルールを与えます。

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

all: A C 

ターゲットをコマンドラインで指定しない場合、makeはmakefileに表示される最初のターゲットをビルドします。したがって、これをファイルの最初のターゲットとして、その下に他のターゲットを配置したいと考えています。あなたがそれを木のように考えるなら、これは木の根であり、下の各項目はその木の枝です。

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

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++ファイルをコンパイルする方法を伝えるルールを組み込んでいます。これらはあなたのメイクファイルがトップに向けて、このようなものが含まれてようについて次のようになります。

あなたが必要とするフラグにそれを設定したいので、コンパイラへのフラグとしてCFLAGSの現在の値を渡し
CC = gcc 

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

- にあなたのケース:

通常は、通常はターゲットの前にあるメイクファイルの先頭に配置します。

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

+0

(Typo、 'C:Co Bo') – Beta

+0

@Beta:おっと。ありがとうございました。一定。 –

関連する問題