如何制作一个makefile来同时编译C、c++和Java文件

How to make a makefile that will compile C, C++, and Java files all at once

本文关键字:编译 c++ 文件 Java 何制作 makefile 一个      更新时间:2023-10-16

我试图创建一个Makefile,它将编译和运行一个马尔可夫算法的3种不同的实现。我是新的制作文件,所以如果有多个错误,请让我知道。同样,如果我想用-O3优化编译器,我该在哪里做呢?

当我运行时,我目前得到这些错误:

Makefile:28: warning:覆盖目标' 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)

  • 有两个规则使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是相当坏的:-)我认为你只是想把所有三个目标的先决条件行?