我正在尝试创建一个Makefile,它将同时编译并运行markov算法的3种不同实现。我是makefile的新手,所以如果有多个错误,请告诉我。另外,如果我想使用-O3优化编译,该在哪里做?

当我运行时,当前出现以下错误:



这是我的makefile的代码:

javaC=javac
javaR=java
CC=g++
CC=gcc

CFLAGS=-O0
OPT=-deprecation
TARGET1=./java_markov
TARGET2=./markov_cpp
TARGET3=./markov_c
INFILE=./alice30.txt
OUTFILE1=./markov_java_out.txt
OUTFILE2=./output/markov_cpp_out.txt
OUTFILE3=./output/markov_c_out.txt

$(TARGET1).class: Markov.java
    $(javaC) Markov.java

$(TARGET2): markov.o
    $(CC) $(CFLAGS) -o $(TARGET2) markov.o
markov.o: markov.cpp
    $(CC) $(CFLAGS) -c markov.cpp


$(TARGET3) : markov.o eprintf.o
    $(CC) $(CFLAGS) -o $(TARGET3) markov.o eprintf.o
markov.o : markov.c
    $(CC) $(CFLAGS) -c markov.c
eprintf.o : eprintf.c eprintf.h
    $(CC) $(CFLAGS) -c eprintf.c

clean:
    rm -f *.class $(OUTFILE1)
    rm -f *.o $(TARGET2) $(OUTFILE2)
    rm -f *.o $(TARGET3) $(OUTFILE3)
run: $(TARGET1).class
    $(javaR) $(TARGET1) < $(INFILE) > $(OUTFILE1)
    $(TARGET2)
    $(TARGET2) <$(INFILE) >$(OUTFILE2)
    $(TARGET3)
    $(TARGET3) < $(INFILE) > $(OUTFILE3)

最佳答案

  • 您确实有两个规则来制作markov.o。如果您确实在同一文件夹中有C和C++端口,请尝试重命名其中之一:
    markov-c++.o: markov.cpp
    $(TARGET2): markov-c++.o …
    
  • 如果您不再链接.o,则实际上不必对中间.o文件使用两步编译。你可以做
    $(TARGET2): markov.cpp
        $(CC) $(CFLAGS) markov.cpp -o $(TARGET2)
    
  • 另一个警告表明目录中没有名为Markov.java的文件。它可能在子目录中还是其他内容中?
  • make run很烂:-)我想您只是想将所有三个目标都放在前提条件行上?
  • 10-04 20:52
    查看更多