다음 규칙과 같은 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 전용 솔루션이기는 하지만 가능한 솔루션을 제공합니다.두 번째 확장. 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차 전개에 의존하는 것보다 문제를 해결하는 더 좋은 방법이 종종 있지만 이는 수행하려는 작업의 전반적인 목표를 이해해야만 결정할 수 있습니다.)