2010-05-17 4 views
3

나는 동시에 컴파일해야하는 세 개의 프로그램을 가지고 있는데, 두 개는 C로 작성되었고 두 개는 java로 작성되었다. 나는 C가있을 때 Makefile을 사용하여 세 가지 작업을 모두 마쳤지 만 그 중 하나를 java로 다시 작성했습니다 ... 같은 makefile을 사용하여 한 번에 3을 모두 컴파일 할 수있는 방법이 있습니까?동시에 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을 참조하십시오. 즉, Bazel 또는 Gradle과 같은 최신 빌드 시스템을 고려할 수 있습니다. 이 시스템은 사용하기가 훨씬 쉽고, 오류가 발생하기 쉽고, 이식성이 뛰어나므로 더 휴대 가능하도록 설계되었습니다.

+0

"CC"줄을 제거하면 문제가 해결되었지만 (프로젝트의 이전 C 시도에서 나온) "kasiski.c"및 "kasiski.h"파일에서 많은 잡음과 오류가 발생했습니다 make (나는 아직도 이유를 이해할 수 없다). 이 소스 파일을 삭제 한 후에는 모든 것을 컴파일하고 방해하지 않았습니다. 감사! –

+0

@ Michael : https://sites.google.com/site/michaelsafyan/coding/resources/how-to-write-a-makefile 페이지를 찾을 수 없습니다. 새로운 링크를 제공합니다 –

+0

죄송합니다, 그것은 얼마 전 https://sites.google.com/site/michaelsafyan/software-engineering/how-to-write-a-makefile로 옮겼으며, 나는 이와 같은 죽은 링크가 있다는 것을 깨닫지 못했습니다. 업데이트 됨. –

관련 문제