我正在尝试创建一个Makefile,它将同时编译和运行马尔可夫算法的3种不同实现。我是makefiles的新手,所以如果有多个错误,请告诉我。另外,如果我想用-O3优化编译,我会在哪里做到这一点?
当我跑步时,我目前遇到这些错误:
Makefile:28:警告:覆盖目标`markov.o'的命令
Makefile:22:警告:忽略目标`markov.o'的旧命令
make: * 没有规则来制作目标
Markov.java', needed by
java_markov.class'。停止。
以下是我的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)
答案 0 :(得分:3)
您做有两个规则可以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
非常糟糕:-)我想你只是想把所有三个目标放在先决条件线上?