2010-05-17 83 views
3

我有三个需要同时编译的程序,2个用C编写,1个用java编写。当他们在C中时,我有三个人使用Makefile,但后来用java重写了其中的一个......有没有办法用相同的makefile一次性编译所有3个?Makefile同时编译C和Java程序

这里是我当前的Makefile:

CC=gcc 
JC=javac 
JFLAGS= -g 
CFLAGS= -Wall -g -std=c99 
LDFLAGS= -lm 
.SUFFIXES: .java .class 
.java.class: 
$(JC) $(JFLAGS) $*.java 

CLASSES = kasiski.java kentry.java 

ALL= ic ftable kasiski 

all: $(ALL) 

ic: ic.o 

kasiski: $(CLASSES:.java=.class) 

ftable: ftable.o 

ic.o: ic.c ic.h 

ftable.o: ftable.c ftable.h 

.PHONY: clean 

clean: 
rm -rf core* *.class *.o *.gch $(ALL) 

回答

3

是的,你可以一次编译它们。如果你的“全部”目标取决于所有三个应用程序,那么“全部制造”应该构建所有这些应用程序。您可以使用三个独立的线程和/或进程来引入“-j3”来实际编译(不清楚“一次”的含义)。另外,这里有几点批评:

  • 不要定义“CC”,“CFLAGS”或“LDFLAGS”。您不应该定义“CC”,因为它会自动定义为系统上的默认C编译器,您应该仅仅根据需要(使用+ =)将它附加到“CFLAGS”和“LDFLAGS”分配给他们会使你的Makefile变得不灵活(因为它们不能被覆盖或外部扩充)。
  • 使用CLASSES来引用“.java”文件是令人困惑的......你应该把变量重命名为JAVA_SRCS,并定义JAVA_CLASSES = $ {JAVA_SRCS:.java = .class}。

欲了解更多解释,请参阅我的Makefile tutorial。也就是说,您可能需要考虑更现代的构建系统,如BazelGradle。这些系统被设计成使用起来更简单,更容易出错,更便携(因为它们更易于携带),而且速度更快。

+0

删除“CC”行解决了这个问题...虽然我也有文件“kasiski.c”和“kasiski.h”(来自以前C项目的尝试),这导致了很多噪音和错误使(我仍然无法弄清楚为什么)。删除这些源文件后,它会毫无困难地编译所有内容。谢谢! – 2010-05-18 02:00:08

+0

@ Michael:https://sites.google.com/site/michaelsafyan/coding/resources/how-to-guides/how-to-write-a-makefile 页未找到 提供新链接 – 2015-07-25 17:20:43

+0

对不起,它刚刚转移到https://sites.google.com/site/michaelsafyan/software-engineering/how-to-write-a-makefile,但我没有意识到仍有像这样的死链接。更新。 – 2015-07-25 23:26:32