Java 我试图编写自己的makefile,但它没有';行不通

Java 我试图编写自己的makefile,但它没有';行不通,java,makefile,Java,Makefile,当我尝试“maketest”时,shell说“make:**没有规则使目标'test'。停止。” 但是我确实写了“java CounterStatTester”,为什么它仍然找不到规则?这里有很多糟糕风格的实例。我不会只是回答这个问题,我会试着按照出现的顺序列出所有的问题。如果你按照我的建议去做,你原来的问题肯定会消失 如果你知道自己在做什么,并且有充分的理由这样做,并且已经学会了好的风格,那么使用“糟糕的风格”是可以的。就你而言,这些都不是问题 后缀已过时,不应用于新代码 同样,“后缀规则”如

当我尝试“maketest”时,shell说“make:**没有规则使目标'test'。停止。”
但是我确实写了“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 $<
    
  • 最后,makefile的顶部应该有一个
    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