即使没有任何更改,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 也会继续编译