Как создать make-файл, который будет компилировать файлы C, C ++ и Java одновременно - PullRequest
3 голосов
/ 09 декабря 2011

Я пытаюсь создать Makefile, который будет компилировать и запускать 3 разные реализации алгоритма Маркова одновременно.Я новичок в makefiles, так что если есть несколько ошибок, пожалуйста, дайте мне знать.Кроме того, если бы я хотел оптимизировать компиляцию с -O3, где бы я это сделал?

Когда я запускаю, я в настоящее время получаю следующие ошибки:

Makefile: 28: warning:переопределение команд для цели `markov.o '

Makefile: 22: предупреждение: игнорирование старых команд для цели` markov.o'

make: * Правило не заданоtarget Markov.java', needed by java_markov.class '.Стоп.

Вот код моего make-файла:

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)

1 Ответ

3 голосов
/ 09 декабря 2011
  • У вас до есть два правила для создания 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 довольно разбито :-) Я думаю, вы просто хотели поместить все три цели в строку предварительных условий?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...