Makefile 종속성에서 `[email protected]`을 사용하면 작동하지 않습니다.

Makefile 종속성에서 `[email protected]`을 사용하면 작동하지 않습니다.

다음과 같은 Makefile 규칙을 사용해도 작동하지 않았습니다(GNU Make 4.0).

foo:   [email protected] other.o

bar:   bar.o other.o

파일이 foo.c(로) 컴파일되었지만 foo.o링크 명령은 입니다 cc -o .o.

대조적으로 은(는) 다음 bar과 같이 올바르게 컴파일되고 링크되었습니다 cc bar.o other.o -o bar.

차이점(또는 문제)을 누가 설명할 수 있나요?

답변1

이에 대해서는 다음 섹션에서 다룹니다.자동 변수GNU Make 매뉴얼에서:

자동 변수 값을 사용할 수 있는 제한된 범위를 인식하는 것이 매우 중요합니다. 자동 변수 값은 레시피 내의 값만 갖습니다. 특히 규칙의 대상 목록 내 어디에서도 사용할 수 없습니다. 거기에는 값이 없으며 빈 문자열로 확장됩니다. 또한 규칙의 필수 조건 목록 내에서 직접 액세스할 수 없습니다. 일반적인 실수는 $@전제조건 목록 내에서 사용하려고 시도하는 것입니다. 이것은 작동하지 않습니다.

단락의 나머지 부분에서는 GNU Make에 특정한 솔루션이기는 하지만 가능한 솔루션을 제공합니다.2차 확장. Makefile을 다음과 같이 작성하십시오.

.SECONDEXPANSION:

foo:   [email protected] other.o

bar:   bar.o other.o

적절한 값을 부여한 $$@다음

$ make foo
cc    -c -o foo.o foo.c
cc    -c -o other.o other.c
cc   foo.o other.o   -o foo

당신이 바라는 일을 합니다.

(내 경험상 일반적으로 2차 확장에 의지하는 것보다 문제를 해결하는 더 나은 방법이 있지만 이는 수행하려는 작업의 전반적인 목표를 이해해야만 결정할 수 있습니다.)

관련 정보