2009-08-28 6 views
12

우리는 make 파일을 생성하는 데 필요한 C++ 코드가 있습니다. 각 .h와 .C 쌍은 객체를 생성 한 다음 일부 객체가 함께 링크되어 실행 파일을 만듭니다. 꽤 표준적인 것들.gmake는 디렉토리에있는 모든 파일을 컴파일합니다.

이 아닌 GNU make 명령은 디렉토리에있는 객체로 모든 파일을 빌드

%.o:%.C 
    $(CC) $(CPFLAGS) -c $< 

이것이 수행하는 (즉, 모든 .C 파일) A가 .o 인 파일을 해당 건설 각 %의 .C 파일입니다 .

아무도 gmake로 이것을 수행하는 방법을 알고 있습니까?

건배

마크

답변

19

표시 한 구문을 GNU make parlance에서 패턴 규칙이라고하며이 패턴은 솔루션의 모퉁잇돌을 형성합니다. .C 파일 목록을 동적으로 가져 오는 방법을 추가하면됩니다. 다른 사람들은 이것을 수행하기 위해 $(shell)을 사용하는 솔루션을 보여 왔지만 불필요하게 비효율적입니다.

SRCS = $(wildcard *.C) 
OBJS = $(patsubst %.C,%.o,$(SRCS)) 
foo: $(OBJS) 
     $(CC) -o [email protected] $^ 

%.o: %.C 
     $(CC) $(CPFLAGS) -c $< 

이 더 간결 뭔가를 찾고 있다면, 다음도 작동합니다 :

난 당신이 대신 GNU 내장 이러한 목적을 위해 설계 기능 만든다 인 $ (와일드 카드)를 사용하는 것이 좋습니다
foo: $(patsubst %.C,%.o,$(wildcard *.C)) 

이것은 단지 변수를 제거하고 GNU make가 패턴 집합의 기본값 인 %.o: %.C을 제공한다는 사실과 객체 세트에서 실행 파일을 함께 연결하는 기본 규칙을 활용합니다. 개인적으로는 읽기와 유지가 더 쉬울 때 좀더 자세한 버전을 사용 하겠지만 각자 독자적으로 사용합니다. 도움이

희망,

에릭 Melski

1

이것은 pattern rule의 예입니다, 그것은 gmake에서 잘 작동합니다. 이와 같은 매우 간단한 빌드의 경우 대부분 implicit rules에 의존 할 수 있습니다. 당신이 가진 중요한 것은 당신이 구축하려는 목표 및 종속성에 지정 :

CXXFLAGS:=-g -O -Iincludes 
LDFLAGS:=-lm 

SRCS:=$(shell ls *.C)   # select all .C files as source 
OBJS:=$(substr .C,.o,$(SRCS) # list the corresponding object files 

foo : $(OBJS) 

주의 양을 줄일 수 있습니다 simply expanded variable 할당 연산자 (:=)보다는 재귀 할당 연산자 (=)의 사용 재 처리는보다 복잡한 빌드에서합니다.

+0

당신 잘못이야; OP는 정적 패턴 규칙이 아닌 표준 패턴 규칙을 보여 주며 $ (와일드 카드)가 추가 오버 헤드없이 트릭을 수행하는 $ (셸)을 사용하는 데는 이유가 없습니다. –

+0

@Eric : 물론 정적 패턴 규칙을 수정하십시오. 결정된. 나는 종종 명령을 일반화하기 때문에 여분의 포크에도 불구하고 $ (셸)을 많이 사용합니다. using : = assignment 나는 그가 한 번만 여분으로 고통받습니다. – dmckee

+0

원하는 경우 $ (와일드 카드)와 같이 쉽게 사용할 수 있습니다. –