我的 makefile 总是会重建项目,即使没有进行任何更改。
如何修复它?
我的项目结构遵循通常的 bin/、src/、Makefile 模式。
生成文件:
# output directory
BIN = bin/
# input directory
SRC = src/
# java compiler
JC = javac
# compile flags
JFLAGS = -d $(BIN) -cp $(SRC)
sourcefiles = $(addprefix $(SRC), \
A.java \
B.java \
C.java)
classfiles = $(sourcefiles:.java=.class)
all: $(classfiles)
%.class: %.java
$(JC) $(JFLAGS) $<
clean:
$(RM) $(BIN)*.class
我根据网上找到的示例制作了这个 makefile,但我不确定我是否理解所做的一切,所以如果我也能得到解释,那就太好了:3
最佳答案
一般来说,make
不太适合 Java。 Make 与行为类似于传统编译器的工具配合使用效果最佳:它们采用输入文件 foo.X
(也许还有其他一些输入文件),它们生成一个输出文件 foo.Y
。对于 C 编译器,例如 X
是 c
和Y
是 o
( foo.c
编译为 foo.o
)。
当编译器的一次调用生成多个输出文件的情况下,Make 很难使用,并且当输出文件的名称与输入文件的名称不直接相关时,使用起来并不简单(在这种情况下,您必须编写所有显式规则,而不是模式规则)。
对于 Java 编译器,单个 .java
输入文件可以生成多个不同的.class
文件,以及 .class
的名称文件不一定与 .java
的名称相关文件。
在您的情况下,我敢打赌,如果您查看输出文件,javac
正在为您生成A.java
文件你会看到它没有生成 A.class
。因为A.class
不存在,make 将始终尝试重建它。
哦。还。您将文件放在不同的目录中。因此,即使您确实将自己限制在名称相同的情况下,您也必须像这样编写模式:
# ... Keep the first part as in your example
classfiles = $(patsubst $(SRC)%.java,$(BIN)%.class,$(sourcefiles))
all: $(classfiles)
$(BIN)%.class : $(SRC)%.java
$(JC) $(JFLAGS) $<
# ... Keep the clean rule as in your example
模式%
必须相同;如果你把东西放在不同的目录中,它们就不一样。
关于Java Makefile 总是会重建,即使没有进行任何更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42936284/