重定向Makefile中的Java输出

重定向Makefile中的Java输出,java,unix,makefile,Java,Unix,Makefile,我是Makefiles的新手,目前正在编写一个。这就是我到目前为止所做的: cc = gcc EXE = foo JAVAC = javac JRE = java PAGER = less TEST_OUT = test.out EXP_OUT = expected.out #clean run-py run-c read run-java save-java and test-java are all phony targets. foo.o : foo.c foo.h $

我是Makefiles的新手,目前正在编写一个。这就是我到目前为止所做的:

cc = gcc
EXE = foo
JAVAC = javac
JRE = java
PAGER = less
TEST_OUT = test.out
EXP_OUT = expected.out

#clean run-py run-c read run-java save-java and test-java are all phony targets.

    foo.o : foo.c foo.h
    $(cc) -c foo.c

main.o: main.c foo.h
    $(cc) -c main.c

$(EXE): foo.o main.out
    $(cc) -o$(EXE) main.o foo.o

run-c: $(EXE)
    ./$(EXE)

run-py: foo.py
    ./foo.py

read:
    $(PAGER)

foo.class: foo.java
    $(JAVAC) foo.java

run-java: foo.class
    $(JRE) foo

save-java: foo.class
    $(JRE) foo > $(TEST_OUT)

test-java: $(TEST_OUT) $(EXP_OUT)
    -@if diff $(TEST_OUT) $(EXP_OUT) &> /dev/null ; then \
    echo "Passed!" ;\
    else \
    echo "Not the same!" ;\
    fi

    clean:
       rm foo.o\
       rm main.o\
       rm $(EXE)\
       rm run-c\
       rm run-py\
       rm foo.class\
       rm rn0java\
       rm save-java\
       rm test\java
保存java
中,我想运行我的java程序,但将输出重定向到
$(TEST\u OUT)
。我怎样才能做到这一点?另外,在一个教程中,我发现有人在
clean
中使用了
-\rm xxx
。它与简单地写
rmxxx
有什么不同吗

这是输出:
make:**“测试java”所需的目标“test.out”无规则生成。停止

我想我的重定向仍然是错误的。

除了我不确定您的C和java程序之间的关系之外,以下是我认为您正在尝试的

target:=foo
test:=test.out
应为:=应为.out
JAVAC:=JAVAC
JAVAFLAGS:=
JRE:=java
main.o$(目标).o:%.o:%.h
$(目标):$(目标).o main.o
%.class:%.java
$(JAVAC)$(JAVAFLAGS)$^
$(测试输出):$(目标).class
$(JRE)$<>$@
.PHONY:java测试清理
java测试:$(测试输出)$(测试输出)
diff-q$^
清洁:$(RM)$(目标).o main.o$(目标)$(目标).class
  • cc
    应该是指向默认编译器(或编译器本身)的文件链接,您不需要在makefile中定义它。默认情况下,将
    CC
    设置为
    CC
    ,并在C源文件和链接的隐式规则中使用
    CC
  • 我看不出你们提到的很多所谓的
    。虚假的
    目标有什么用处,你们为什么要删除它们?它们不是文件
  • Make已经知道如何编译C源文件,它还将自动链接
    foo
    ,因为它的先决条件之一是
    foo.o
  • diff
    已经有一个“这两个文件相同吗”标志(
    -q
  • 您应该在顶部有一个名为
    all
    .PHONY
    目标来执行默认操作,但我不知道在这种情况下会是什么

使用
重定向输出,并且
-
用于“静默”
rm
(据我所知)是否像“$(JRE)foo>$(TEST_OUT)”那样
TEST.OUT
main.OUT
应该如何生成?噢,对不起!那应该是主要的。test.out和expected.out已经存在于我的文件夹中。@user657267您好,我刚刚发现我无法生成
test.out
。。也许我的重定向是错误的。事实上我刚刚完成它,但仍然非常感谢你。