Java 我试图编写自己的makefile,但它没有';行不通
当我尝试“maketest”时,shell说“make:**没有规则使目标'test'。停止。”Java 我试图编写自己的makefile,但它没有';行不通,java,makefile,Java,Makefile,当我尝试“maketest”时,shell说“make:**没有规则使目标'test'。停止。” 但是我确实写了“java CounterStatTester”,为什么它仍然找不到规则?这里有很多糟糕风格的实例。我不会只是回答这个问题,我会试着按照出现的顺序列出所有的问题。如果你按照我的建议去做,你原来的问题肯定会消失 如果你知道自己在做什么,并且有充分的理由这样做,并且已经学会了好的风格,那么使用“糟糕的风格”是可以的。就你而言,这些都不是问题 后缀已过时,不应用于新代码 同样,“后缀规则”如
但是我确实写了“java CounterStatTester”,为什么它仍然找不到规则?这里有很多糟糕风格的实例。我不会只是回答这个问题,我会试着按照出现的顺序列出所有的问题。如果你按照我的建议去做,你原来的问题肯定会消失 如果你知道自己在做什么,并且有充分的理由这样做,并且已经学会了好的风格,那么使用“糟糕的风格”是可以的。就你而言,这些都不是问题
后缀
已过时,不应用于新代码.java.class:
已经过时,不应使用.java.class:
规则都应该获取一个.java
文件并生成一个.class
文件。makefiles中的好风格是,每个规则配方一次生成一个目标,而不是多个目标#define the suffixes
.SUFFIXES: .java .class
#compile all java files to .class
.java.class:
javac -g *.java
#CounterStatTester is a tester class for CounterStat
CounterStatTester.class: CounterStat.class
test: CounterStatTester.class CounterStat.class
java CounterStatTester
%.class: %.java Makefile
javac -g $<
all
目标:
CounterStat_tested: CounterStatTester.class CounterStat.class Makefile
java CounterStatTester && touch $@
Makefiles可能会很挑剔,因为它们希望在最后一行有一个尾随的换行符,并且还希望有制表符,而不是缩进空格。@Andrewilliamson我确实在每一行之前添加了制表符。基本上,我在代码中有问题吗?代码看起来很好-当你尝试这个时,你有文件
CounterStat.class
可用吗?只有java文件。为什么我需要上课当我尝试这个?makefile的目的是正确地编译它们,不是吗?test
规则取决于CounterStat.class。如果没有具有该名称的文件,它将查找具有该名称的规则。如果没有具有该名称的规则,则依赖关系无法解决,因此无法运行test
规则。但是,如果我删除CounterStatTester.class:CounterStat.class,CounterStatTester.class如何知道在何处找到CounterStat并在tester中实现它?@FrankJoe这是一个Java问题。Java对此负责。与Make无关。你的多余规则只是为了制造,没有告诉Java任何东西。
.PHONY: all
all: CounterStatTester.class CounterStat.class CounterStat_tested