2017-05-17 60 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否则会发生更改

相关问题