2016-04-17 16 views
1

私は最初のMakefileを作成しようとしていますが、問題はあります。何も変更されていなくても、すべてを再コンパイルします。どうすればこの問題を回避できますか?あなたはおそらくすでに気づいたように、コンパイルの結果はMakefileがすべてを再コンパイルする

もう一つ質問./binディレクトリ内にする必要があり、

また
all: rmdup lsall lsdir 

rmdup: rmdup.c 
    cc -Wall -o ./bin/rmdup rmdup.c 

lsall: lsall.c 
    cc -Wall -o ./bin/lsall lsall.c 

lsdir: lsdir.c 
    cc -Wall -o ./bin/lsdir lsdir.c 

:ここにMakefileがあります私が持っているものの違いは何ですか、とこの?

all: rmdup lsall lsdir 

rmdup.o: rmdup.c 
    cc -Wall -c -o ./bin/rmdup.o rmdup.c 
rmdup: rmdup.o 
    cc -o ./bin/rmdup ./bin/rmdup.o 

lsall.o: lsall.c 
    cc -Wall -c -o ./bin/lsall.o lsall.c 
lsall: lsall.o 
    cc -o ./bin/lsall ./bin/lsall.o 

lsdir.o: lsdir.c 
    cc -Wall -c -o ./bin/lsdir.o lsdir.c 
lsdir: lsdir.o 
    cc -o ./bin/lsdir ./bin/lsdir.o 

ありがとうございます!

+1

あなたのターゲットはコマンド –

答えて

5

最初の質問に答えてください:ターゲットが生成するファイルと一致しないため、この方法で修正してください。 make allにファイルではないことを伝える.PHONYターゲットを追加してください。

all: bin/rmdup bin/lsall bin/lsdir 

bin/rmdup: rmdup.c 
    cc -Wall -o bin/rmdup rmdup.c 

bin/lsall: lsall.c 
    cc -Wall -o bin/lsall lsall.c 

bin/lsdir: lsdir.c 
    cc -Wall -o bin/lsdir lsdir.c 

.PHONY: all 

2番目の質問への回答:2番目のメイクファイルは、オブジェクトファイルをコンパイルし、プログラムをリンクするように設計されています。リンクすると、いくつかのオブジェクトファイルをリンクすると面白いことがあります。わずかなソースファイルしか変更されていない場合、ビルド時間が短縮されます。

編集:2番目の質問への私の答えを明確にするために、メインソースがmain.cで、書いたモジュールをいくつでも使用してプログラムをコンパイルするのに使うことができるmakefileをヘッダと.hと

CC=gcc 
CFLAGS=-Wall -Wextra -Werror -stg=gnu99 
LDFLAGS=-lm 

SRCS=$(wildcard *.c) 
OBJS=$(SRCS:%c=%.o) 
HEADERS=$(wildcard *.h) 

.PHONY:all mrproper clean 

all:main 

main:$(OBJS) 
    $(CC) -o [email protected] $? $(LDFLAGS) 

main.o:main.c $(HEADERS) 
    $(CC) $(CFLAGS) -o [email protected] $< 

%.o:%.c %.h 
    $(CC) $(CFLAGS) -o [email protected] $< 

mrprorer:clean 
    rm -f main 

clean: 
    rm -f $(OBJS) 

.Cソースファイルには、あなたはmake allで初めて構築し、あなたが唯一の生成に一つのオブジェクトファイルを持っていますし、リンクを再度行うに一つだけのソースファイルを変更した場合。

+0

の出力とは異なります。 'all:bin/rmdup lsall lsdir'ではなく' all:bin/rmdup bin/lsall bin/lsdir'ですか? – jboockmann

+0

@pytheos確かに。 – jdarthenay

+0

ありがとう、それは働いた!私はすでにこの方法で試していたが、すべてを変更するのを忘れていた: – Tirafesi

関連する問題