我试着四处看看,但我在这里看到的所有问题都太高了,我无法理解。
这是我的制作文件:
compile: bin src cmp
bin: mkdir bin
src: find src -name "*.java" > sources.txt
cmp: javac -cp biuoop-1.4.jar -d bin @sources.txt
run: java -cp biuoop-1.4.jar:bin:src/resources Ass6Game
jar: jar -cmf Ass6Game.jar Manifest.txt -C bin . -C src resources
当我尝试运行make compile
时,我会得到"多目标模式"错误。我做错了什么?
您的makefile语法不正确。
make规则的语法是
一般来说,一条规则如下:
targets : prerequisites recipe …
或者像这样:
targets : prerequisites ; recipe recipe
然而,您的配方行位于先决条件位置,因此java命令中的:
会混淆make。
你的makefile应该像这个
compile: bin src cmp
bin: ; mkdir bin
src: ; find src -name "*.java" > sources.txt
cmp: ; javac -cp biuoop-1.4.jar -d bin @sources.txt
run: ; java -cp biuoop-1.4.jar:bin:src/resources Ass6Game
jar: ; jar -cmf Ass6Game.jar Manifest.txt -C bin . -C src resources
或者像这个
compile: bin src cmp
bin:
mkdir bin
src:
find src -name "*.java" > sources.txt
cmp:
javac -cp biuoop-1.4.jar -d bin @sources.txt
run:
java -cp biuoop-1.4.jar:bin:src/resources Ass6Game
jar:
jar -cmf Ass6Game.jar Manifest.txt -C bin . -C src resources
或者实际使用make为你提供的东西更像这个
JAR := biuoop-1.4.jar
SOURCES := $(shell find src -name '*.java')
# Or if src is a single directory without sub-directories
#SOURCES := $(wildcard src/*.java)
GAMEJAR := Ass6Game.jar
.PHONY: all
all: $(JAR)
bin:
mkdir bin
$(JAR): $(SOURCES) | bin
javac -cp $@ -d bin $^
# See http://www.gnu.org/software/make/manual/make.html#Force-Targets for what `FORCE` is doing here.
$(GAMEJAR): FORCE
jar -cmf $@ Manifest.txt -C bin . -C src resources
FORCE: ;
.PHONY: run
run: $(GAMEJAR)
java -cp $(JAR):bin:src/resources $(GAMEJAR)
它更好地遵循了Makefiles规则,实际上可以让make根据需要智能地重建文件。