2017-05-17 94 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; 
} 

生成文件

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修復重建如果標題更改我只列出所有我的頭文件,然後添加$(HEADERS)作爲從C src文件構建目標文件的部分依賴項。它的效率不高,因爲它可能是,但我覺得它足夠好,即

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

您是否嘗試過在製作之前進行清潔? 清理並編譯應該可以工作

+0

這是一條評論,而不是答案。在撰寫評論前先獲得50個聲望。 –

1

一般來說,如果需要編譯源文件來創建目標文件,那麼它的依賴文件也需要重建。

因此,編譯時簡單地重新生成它,而不是爲.d文件單獨設置目標。爲了實現這一目標,一個簡單的方法是用

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

注意,如果編譯成功依賴文件將只regnerated更換

$(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文件內置追加。

至於如何讓他們到(重)建在首位 - 如果你化妝的版本太真的老了,不(再)自動建立他們,你既可以有這樣的事情:

all: depend subs 

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

(順便說一句,我認爲它會看起來更整潔如果這是在一個變量BTW,也更有效率)

或者添加一個依賴的對象建築物像這樣:

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

但是這兩種解決方案都會要求您運行make兩次,因爲它不會生效include否則會發生更改

相關問題