即使没有任何更改,Makefile也会编译文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使没有任何更改,Makefile也会编译文件相关的知识,希望对你有一定的参考价值。

我正在尝试为我正在编写的小shell创建一个makefile。文件是:

myShell.c
myShellFunc.c
parser.y
shel.l

makefile:

CC = gcc
CFLAGS= -g -Wall


myshell: myShell.o myShellFunc.o parser.tab.o lex.yy.o
    $(CC) $(CFLAGS) myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

myShell.o: myShell.c myShell.h parser.tab.h
myShellFunc.o: myShellFunc.c myShell.h

parser.tab.c: bisonfiles
parser.tab.h: bisonfiles
lex.yy.c: shell.l
    flex shell.l

.PHONY: bisonfiles
bisonfiles: parser.y
    bison -d parser.y

问题是,即使文件没有变化,它仍会编译它们。

当我第一次运行make时,我明白了:

bison -d parser.y
gcc -g -Wall   -c -o myShell.o myShell.c
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
flex shell.l
gcc -g -Wall   -c -o lex.yy.o lex.yy.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

我第二次运行它,没有改变任何东西:

bison -d parser.y
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

我第三次运行它而没有改变任何东西:

bison -d parser.y
gcc -g -Wall   -c -o myShell.o myShell.c
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

当我没有做出任何改变时,为什么会发生这种情况? 如何正确编写makefile?

答案

来自GNU make documentation ......

伪目标不应该是真实目标文件的先决条件;如果是,每次make更新该文件时都会运行其配方。

但是你有...

parser.tab.c: bisonfiles
parser.tab.h: bisonfiles
lex.yy.c: shell.l
        flex shell.l

.PHONY: bisonfiles
bisonfiles: parser.y
        bison -d parser.y

在这里bisonfiles已被宣布为.PHONY目标,因此,你看到bison -d parser.y在每个make调用上运行。

最简单的解决方案可能是完全摆脱bisonfiles目标,只使用模式规则......

%.tab.c %.tab.h: %.y
        bison -d $<

以上是关于即使没有任何更改,Makefile也会编译文件的主要内容,如果未能解决你的问题,请参考以下文章

即使我不保存更改,Visual Studio Code 也会继续编译

即使没有更改联系人,也会调用内容观察者

即使没有分派任何操作,Redux 状态也会在加载时更改

为啥即使禁用缓存,服务器也会忽略代码文件中的更改?

为啥即使我没有将 vuex 状态绑定到任何 html 输入元素,我的 vuex 状态也会在更改组件级别状态时发生变化?

即使没有更改,ndk-build也会安装库。这可以改变吗?