2012-03-10 3 views
1

내가 differnt 한 경로와 각 C 파일의 무리, 그래서 내가 각 C에서 오브젝트 파일을 구축하고자C 파일이 다른 경로

SRC=/path1/path2/file1.c file2.c /usr/joe/files/file3.c 

같은 것을 가지고있을 때 객체 파일을 작성하는 규칙을 작성하는 방법 빌드 디렉토리에 파일을, 그래서 내가 한 : 이것은 잘 작동하고 내가 가진

SRCBASE=$(notdir $(SRC)) 

OBJS= $(addprefix $(OBJDIR)/,$(SRCBASE:.c=.o)) 

OBJS 구축입니다/file1.o/file3.o

내 질문 file2.o의 구축/IS 구축 방법 오브젝트를 빌드하기위한 암시적인 규칙을 작성하십시오. 파일, 내가하려고 노력 :

build/%.o : %.c 
gcc .... 

을하지만이 규칙은 전체 경로로 파일을 캐치하지 않았기 때문에, 일을 지금 것 같다. 나는 GNU make를 보려고했지만 거기에서 답을 찾지 못했습니다.

감사합니다.

+0

'make '와 같이 보통 (슬픈) 방법은 디렉토리 당 하나의'Makefile'을 갖는 것입니다. 어떤 도구 ('autotools','cmake')는 그 목적을 위해'Makefile'-s를 생성하고 있습니다. http://omake.metaprl.org/와 같은 더 나은 빌더를 사용할 수 있습니다. –

+0

패턴 규칙이있는 마지막 스 니펫에는 어떤 문제가 있습니까? 그것은 잘 작동합니다. 질문에 조리법을 포함시킬 수 있습니까? –

+0

또한,'OBJS'를 만드는 방법이 잘못된 것처럼 보입니다. 'SRC'의'notdir'을 얻지 말아야합니다. 접미어를 바꾸고 객체를 디렉토리에 추가하십시오 :'OBJS : = $ (SRC : % .c = $ (OBJDIR)/% .O)' –

답변

1

VPATH을 사용하여 다른 디렉토리의 파일을 찾을 수 있습니다. 명시 적 경로 대신 암시 적 검색을 수행합니다. 즉, file1.o ~ file3.o가 필요하며 make는 먼저 ., 그 다음은 /path1/path2, 그 다음은 /usr/joe/files이되어야한다고 지정합니다. 그래서 만약 . file3.c을 포함하면 /usr/joe/files에있는 것보다 그 하나를 얻을 수 있습니다 (그렇지 않은 경우 /path1/path2에 하나가 있으면 그 값을 얻을 수 있습니다).

경로 검색이 어쨌든 명시 적 위치보다 유용하다는 것이 밝혀 지므로 일반적으로 원하는 것입니다. 당신이 무언가를 오버라이드 할 필요가 있다면 그냥 복사하거나 "원하는 버전"을 검색 할 첫 번째 위치로 심볼릭 링크하십시오.

+0

. 사실 VPATH로 시작했지만 절대 경로로 바꾸려고했습니다. 그 동안 나는 VPATH를 계속 지킬 것입니다. – eran

+0

Ther은 GNU make의'vpath' 지시자 (소문자)이기도합니다. –