Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 只有一个源发生更改时,Makefile将重建所有对象_C_Makefile - Fatal编程技术网

C 只有一个源发生更改时,Makefile将重建所有对象

C 只有一个源发生更改时,Makefile将重建所有对象,c,makefile,C,Makefile,我使用一个Makefile来编译一个C项目,它按照预期的方式工作,对于一个部分来说是例外:当我在一个源文件中更改一个东西时,整个东西都会重新生成。我很确定问题出在那里: $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @echo -n 'Compiling $@ ... ' $(CC) $(CFLAGS) -c $(patsubst obj/%.o, src/%.c, $@) -o $@ 但是,我明确指定了一个文件作为依赖项,即当前正在生成的文件。这怎么会是个问题

我使用一个Makefile来编译一个C项目,它按照预期的方式工作,对于一个部分来说是例外:当我在一个源文件中更改一个东西时,整个东西都会重新生成。我很确定问题出在那里:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    @echo -n 'Compiling $@ ... '
    $(CC) $(CFLAGS) -c $(patsubst obj/%.o, src/%.c, $@) -o $@
但是,我明确指定了一个文件作为依赖项,即当前正在生成的文件。这怎么会是个问题?
谢谢。

关于make文件中的此代码:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    @echo -n 'Compiling $@ ... '
    $(CC) $(CFLAGS) -c $(patsubst obj/%.o, src/%.c, $@) -o $@
这将创建所有*.o文件

你真正想要的是:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    @echo -n 'Compiling $@ ... '
    $(CC) $(CFLAGS) -c $< -o $@
$(OBJ\u DIR)/%.o:$(SRC\u DIR)/%.c
@echo-n“编译$@…”
$(CC)$(CFLAGS)-c$<-o$@

好吧,我解决了这个问题,这是个愚蠢的问题

SRC_DIR被定义为:

SRC_DIR = src 

最后有一个空格。。。把它取下来,马上就开始工作了。我的坏…

是否为每个文件打印
编译filename.c…
?而且,即使你不做任何改变,它也会这样做吗?是的,它会。对于每个对象文件,即使您没有更改任何内容,它也会重新生成每个文件吗?不,如果没有更改,则什么也不会发生。假设OBJ_DIR=OBJ和SRC_DIR=SRC,为什么第一个文件会创建所有.o文件,而第二个文件不会创建?一个简单的解释:第一个文件会扩展
$(patsubst…)要成为所有转换为*.o文件名的*.c文件名的列表,以及需要生成的每个*.o文件名。有关详细信息,请使用
-d`参数运行make。(这将输出大量信息,其中隐藏的是
patsubst
的扩展。这是不正确的-请注意,替换发生在“$@”上,它不是“所有.c文件名的列表”@伊米比斯,我确实说过这是一个“过于简单的解释”,我很清楚我的评论不是全部,我也知道第二条规则是正确的。