我正在使用 makefile 来构建我的 flex/bison 项目。我遇到了问题,因为它正在添加对 yacc
和 mv
命令的调用,从而覆盖了我的一个文件。
user@dk ~/calc ±master⚡ » make clean
rm -rf lex.yy.c calc.tab.h calc.tab.c calc
user@dk ~/calc ±master » make
bison -d calc.y
flex calc.lex
g++ -o calc calc.tab.c lex.yy.c calc.c
user@dk ~/calc ±master⚡ » make clean
rm -rf lex.yy.c calc.tab.h calc.tab.c calc
user@dk ~/calc ±master » touch calc.y
user@dk ~/calc ±master » make
bison -d calc.y
flex calc.lex
yacc calc.y
mv -f y.tab.c calc.c
g++ -o calc calc.tab.c lex.yy.c calc.c
... Failure ...
我将 makefile 简化到最低限度以重现这一点。使用 bison 创建两个文件:
calc.tab.c
和 calc.tab.h
。我没有 .h 文件作为目标,因为我不确定这样做的正确方法是什么。对 bison 的调用将生成两个 calc.tab.* 文件,因此这不是我的主要关注点。构建这个 makefile 以避免生成对 yacc 和 mv 的调用的正确方法是什么?
calc: calc.tab.c lex.yy.c calc.c
g++ -o calc calc.tab.c lex.yy.c calc.c
calc.tab.c: calc.y
bison -d calc.y
lex.yy.c: calc.lex calc.tab.h
flex calc.lex
clean:
rm -rf lex.yy.c calc.tab.h calc.tab.c calc
最佳答案
mv
来自 make
的内置规则,其中包含:
%.c : %.y
$(YACC.y) $<
mv -f y.tab.c $@
看起来
make
正试图从 calc.c
创建 calc.y
。对此的一些解决方案是自己重新定义该规则,或将 calc.y
重命名为不会为 calc.c
触发该规则的内容,或禁用 make
的内置规则。您可以使用
make -p
列出所有内置规则。关于makefile - Make 添加了意外的 mv 命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12362304/