我的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
答案 0 :(得分:2)
通常,make
不适合Java。使用与传统编译器类似的工具,可以使其工作得最好:它们采用输入文件foo.X
(也可能是其他一些输入文件),并生成单个输出文件foo.Y
。对于C编译器,例如X
为c
而Y
为o
(foo.c
编译为foo.o
)。
在单个调用编译器生成多个输出文件的情况下很难使用Make,并且当输出文件的名称与之不直接相关时,使用它并不简单输入文件的名称(在这种情况下,您必须编写所有显式规则,而不是模式规则)。
对于Java编译器,单个.java
输入文件可以生成多个不同的.class
文件,.class
文件的名称不一定与.java
的名称相关联。文件。
在您的情况下,如果您查看javac
为A.java
文件生成的输出文件,我会打赌您会看到它未生成A.class
{1}}。由于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
模式%
必须相同;如果你把东西放在不同的目录中,它们就不一样了。