gpt4 book ai didi

Java Makefile 总是会重建,即使没有进行任何更改

转载 作者:行者123 更新时间:2023-11-30 02:36:24 25 4
gpt4 key购买 nike

我的 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 编译器,例如 XcYo ( 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com