2017-05-17 8 views
0

hdr.hファイルが変更されたときにGNU-Makeは再コンパイルされません。 以下のように、main.dファイルが生成されても再コンパイルを試みませんでした。 なぜそれが起こったのか教えてくれますか?ヘッダファイルが変更されたときにGNU-Makeが再コンパイルされない

hdr.h

#ifndef __HDR_H__ 

#define LOOP_CNT 1000 

#endif /* __HDR_H__ */ 

main.cの

#include <stdio.h> 
#include "hdr.h" 

int main(void) 
{ 
    int i, sum = 0; 
    for (i = 0; i < LOOP_CNT; i++) sum += i; 
    (void)printf("sum = %d\n", sum); 
    return 0; 
} 

のMakefileここ

SUFFIXES += .d 

.PHONY: clean 

OBJECTS = $(patsubst %.c,%.o,$(wildcard *.c)) 
CC = armcc 
LD = armcc 
CFLAGS += 

# Default target 
all: sum 

sum : $(OBJECTS) 
    $(CC) $(CFLAGS) -o [email protected] $^ 

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

# Generating dependency files 
%.d : %.c 
    @$(CC) -M $< > [email protected] 

# Include dependency file to have gcc recompile necessary sources 
include $(patsubst %.c,%.d,$(wildcard *.c)) 
#$(info $(patsubst %.c,%.d,$(wildcard *.c))) 

clean: 
    rm -f *.o *.d core $(EXEC_NAME) 

は、第二の線が印刷されています。

C:\project\dep>make all 
Makefile:24: main.d: No such file or directory 
armcc -o main.o -c main.c 
armcc -o sum main.o 

C:\project\dep>make all 
make: Nothing to be done for `all'. 

main.dファイルは以下のように生成されます。

__image.axf: main.c 
__image.axf: C:\Program Files\ARM\RVCT\Data\4.1\713\include\windows\stdio.h 
__image.axf: hdr.h 
+0

依存関係( '.d')ファイルに依存しないので、決して生成されません。 –

+0

関連のない注記では、アンダースコアで始まり大文字の文字または*別のアンダースコア*で始まるシンボルはすべてのスコープで予約されています。このようなシンボルを使用しないでください。たとえば、ヘッダーインクルードガードマクロに使用してください。そのようなマクロを実際に定義しているわけではありません... –

+0

あなたの生成した 'main.d'は何を含んでいますか? –

答えて

0

ヘッダーが変更された場合の再ビルドのためのMakefileの修正方法Cのsrcファイルからオブジェクトファイルを作成する部分に$(HEADERS)を依存関係として追加するだけです。すなわち

HEADERS = \ 
    my_header.h \ 
    my_other_header.h 

$(BUILD_DIR)/%.o: %.c $(HEADERS) 
    $(LINK.c) $< -c -o [email protected] 
+0

ヘッダーファイルが次のように指定された後で動作します。 $(OBJECTS):%.o:%.c hdr.h – andwella

0

ビルドする前にmake cleanを試しましたか? クリーンでビルドする必要があります

+0

これはコメントであり、答えではありません。コメントを書く前にまず評判を50にしてください。 –

1

一般に、ソースファイルをコンパイルしてオブジェクトファイルを作成する必要がある場合、その依存ファイルも再構築する必要があります。

したがって、.dファイルに対して別のターゲットを使用する代わりに、コンパイル時に単純に再生成します。これを達成するために、単純なアプローチは、コンパイルが成功した場合、依存関係ファイルのみregneratedされることを

$(OBJECTS) : %.o : %.c 
    $(CC) $(CFLAGS) -o [email protected] -c $< 
    @$(CC) -M $< > [email protected] 

注意して

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

# Generating dependency files 
%.d : %.c 
    @$(CC) -M $< > [email protected] 

を交換することです。コンパイルに失敗すると、オブジェクトファイルが削除されるので、依存ファイルが最新であるかどうかにかかわらず、再コンパイルが強制されます。

+0

ヘッダーが変更されても依存関係は更新されません –

0

ヘッダファイルは、あなたがこのような何かにそれらのビルドルールを変更することができます変更した場合、それはあなたの依存ファイルを再構築するために取得するには、そのようそれができるよう効率的に私はそれが十分であることを見つけることができません:

%.d : %.c 
     $(CC) -M $< > [email protected] 
     @$(CC) -M $< -MT $*.d >> [email protected] 

これは、.dファイルが.cファイルと.hファイルで構築されているという依存関係規則にも追加されるためです。

にそれらを取得する方法については(再)最初の場所で構築する - のmakeのバージョンがあまりにも本当に古いですし、(再)しない場合は、自動的にそれらを構築し、あなたがこのようなものかもしれない次のいずれか

all: depend subs 

depend: $(patsubst %.c,%.d,$(wildcard *.c)) 

(余談ですが、私はそれが変数であった場合、それはところで、また、より効率的でクリーンに見えると思うとおり)

かそこらのようなオブジェクトの構築に依存関係を追加:

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

しかし、両方の解決策では、makeを2回実行する必要がありません。include変更がなければ

関連する問題