2011-12-08 18 views
3

我試圖創建一個Makefile,將編譯和運行馬爾可夫算法的3種不同的實現方式的一次。我是新來的makefile,所以如果有多個錯誤,請讓我知道。另外,如果我想用-O3優化編譯,我會在那裏做什麼?如何使一個makefile,將編譯C,C++和Java都在文件一旦

當我跑,我目前得到這些錯誤:

的Makefile:28:警告:覆蓋爲目標`markov.o」命令

的Makefile:22:警告:無視目標舊命令`markov.o」

化妝:*沒有規則,使目標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

第4行,你設置CC爲gcc(GNU編譯器集合),設置爲g ++後。在我的計算機上使用.cpp文件上的gcc不起作用,因爲它最終會運行C編譯器。嘗試在.c源文件中使用一個用於gcc的變量,另一個用於.cpp源文件中的g ++ – Pete

+0

爲什麼這必須是make文件?爲C和C++版本創建一個make文件,然後在shell或python腳本中運行。 – Falmarri

回答

3
  • 有兩個原則,讓markov.o。如果您確實在同一個文件夾中有C和C++端口,請嘗試重命名其中的一個:例如

    markov-c++.o: markov.cpp 
    $(TARGET2): markov-c++.o … 
    
  • 你真的不使用2步編譯與中間.o文件,如果你沒有任何更多.o的鏈接。你可以只是做

    $(TARGET2): markov.cpp 
        $(CC) $(CFLAGS) markov.cpp -o $(TARGET2) 
    
  • 其他警告表明有沒有在目錄中名爲Markov.java文件。它可能在一個子目錄或其他東西?

  • make run很糟糕:-)我想你只是想把所有三個目標放在先決條件線?

相關問題