【问题标题】:Makefile with Java使用 Java 生成文件
【发布时间】:2020-06-02 18:32:12
【问题描述】:

我意识到 make 并不是用于 Java 的最佳工具,但我只是想尝试一下。我有这个脚本,但我不确定它为什么不起作用:

JFLAGS = -g
JC = javac
SRC_DIR = $(PWD)
.SUFFIXES:  .java .class
.java.class: 
    $(JC) $(JFLAGS) $*.java

CLASSES = \
$(SRC_DIR)/Fibonacci_Methods.java \
$(SRC_DIR)/Fibonacci_Methods_Test.java \

default: classes

classes: 
    $(CLASSES:.java=.class)

clean:
    $(RM) *.class

我得到这个错误:

/path/to/make_test/Fibonacci_Methods.class 
/path/to/make_test/Fibonacci_Methods_Test.class
make: /path/to/make_test/Fibonacci_Methods.class: No such file or directory
make: *** [classes] Error 1

我不知道为什么。我的理解是这个脚本应该定义CLASSES,它应该调用.java.class目标,因为我正在定义以.java结尾的文件。我不知道$(CLASSES:.java=.class) 的目的,因为我原以为在这一步之前就已经完成了编译。

顺便说一下,我还没有编译 java 代码(所以我只用 .java 文件运行 make,如果这有区别的话)。

【问题讨论】:

  • 标签在 Makefile 中很重要。这些行是用制表符还是空格缩进的?

标签: java makefile


【解决方案1】:

这是错误的:

classes: 
        $(CLASSES:.java=.class)

在这里,您定义了一个没有先决条件和配方(应该是用于重建目标的命令)的目标,该目标由 .class 文件名列表组成,因此您会看到您看到的错误因为您不能“运行”.class 文件列表。

你想要这个:

classes: $(CLASSES:.java=.class)

它定义了一个目标classes,其中包含一组先决条件,即您要构建的.class 文件,并且没有配方,因为您不想创建一个名为classes 的目标。

【讨论】:

  • 啊,谢谢。你能解释一下:这有什么意义?我正在定义一个目标classes,但我不想创建一个名为classes 的目标?如果我已经调用隐式方法来编译 .java 文件,这有什么意义?
  • 这正是原因:您没有“调用”隐式规则。隐式规则就像一个带参数的函数:仅定义函数并不会调用该函数。 Make 不会读取 makefile,然后尝试应用它可以找到的所有可能的规则。你必须给 make 一个特定的目标来构建。然后它将使用 makefile 来尝试构建 that 目标。为了构建该目标,它将根据需要使用尽可能多的显式和隐式规则,并且不会使用不需要的规则。
  • 如果你不带参数运行make,那么它将尝试构建在makefile中定义的第一个显式目标。如果您使用参数运行make,它将尝试将这些参数中的每一个构建为目标。这就是它要做的一切:如果没有参数也没有明确的目标,make 只会说“无事可做”,即使有 1,000 条可以用于创建目标的隐式规则。跨度>
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2011-01-10
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多