2017-04-03 5 views
1

Makefile을 사용하여 동일한 gcc 명령으로 개체를 만듭니다.변수에서 개체를 개별적으로 생성

gcc -Wall -c read_line.c -o read_line.o 
gcc -Wall -c client.c -o client.o 

그러나 나는 그것을하는 방법을 모른다, 나는 테스트 모든 작동하지 않습니다 :

SRCLIB = main.c srv.c 
OBJLIB = main.o srv.o 
CC = gcc 
CCFLAGS = -Wall -Werror 

$(OBJLIB) : $(SRCLIB) 
    $(CC) $(CCFLAGS) -c $^ -o [email protected] 

objetive은 다음과 같이 실행할 수 있습니다 :이 파일은 다음과 같습니다. Makefile에서이 작업을 수행 할 수 있습니까?

답변

1

귀하의 메이크 변수가 확장 된 후,이로 확장 : 메이크업에

main.o srv.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 

이 각 대상에 대해 한 번 규칙을 여러 번 작성과 동일처럼 명시 적 규칙에 여러 대상을 사용. 그래서, 문제는이 같은 수 있습니다 :

main.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 
srv.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 

이 즉, (각 개체는, 두 소스에뿐만 아니라 자신의 소스 파일을 의존하기 때문에) 소스 파일의 변화 중 하나는 두 개체 파일은 다시 작성됩니다.

또한 컴파일 라인에서 모든 필수 구성 요소로 확장되는 $^ 변수를 사용합니다. 그래서 컴파일 라인이 확장됩니다에 : 당신이 -o 옵션 -c를 사용하는 경우는 하나 개의 소스 파일을 컴파일 할 수 있습니다 : 불법

gcc -Wall -Werror -c main.c srv.c -o main.o 
gcc -Wall -Werror -c main.c srv.c -o srv.o 

.

Make에는 이미 파일을 컴파일하는 방법을 알고있는 기본 규칙이있어서 직접 작성할 필요가 없습니다. 다음과 같이 쓸 수 있습니다 :

SRCLIB = main.c srv.c 
OBJLIB = main.o srv.o 
CC = gcc 
CCFLAGS = -Wall -Werror 

.PHONY: all 
all: $(OBJLIB) 

그리고 이것 만 있으면됩니다.

+0

당신이 옳습니다, 그건 내 문제였습니다. 나는 네가 한 말대로 했어. 마치 매력처럼 일 했어, 고마워! – captainepoch