2016-11-17 2 views
0

잘 작동하는 bakefile에 의해 생성 된 메이크 파일이 있습니다. 실행 파일을 실행하려면 다른 폴더의 라이브러리가 필요합니다. rpath 명령이이 라이브러리에 대한 경로를 지정하는 데 사용되는 것을 발견했습니다. 하지만 명령을 사용할 때 인자로 makefile에 보내야합니다. bakefile에서 직접 지정할 수 없습니다.시스템 변수를 이스케이프 처리하여 인수로 전달

LDFLAGS 인수를 사용할 수 있습니다. 그리고 here $ ORIGIN 변수를 사용하는 방법을 발견했습니다.

제 질문은 어떻게 작동합니까? 변수를 해석하는 메이크업을 방지하기 위해 작은 따옴표는

make LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"

인가? 왜 \ $가 여기 두 번입니까?

답변

1

Yeesh. 이 얼마나 엉망 이죠.

따라서 make 명령을 시작하기 전에 첫 번째 따옴표 집합이 셸에 의해 제거됩니다. 따옴표의 바깥 묶음은 큰 따옴표이므로, $을 셸에서 셸 변수로 처리해야합니다 (echo "my path is $PWD"과 같은 명령과 비교하고 PWD 변수가 어떻게 확장되는지). 쉘은 백 슬래시를 사용하여 $과 같은 것을 인용합니다. 것이다

$(LD) $(LDFLAGS) ... 

합니다

그래서, 쉘 손이 명령 줄 수 있도록하는 시간으로, 당신의 메이크에서 설정 LDFLAGS=-Wl,-rpath '-Wl,$$ORIGIN'

다음과 같은 명령을 사용하여 조리법 될 것입니다 본다 위와 같이 LDFLAGS 변수를 확장하십시오. make의 경우, 앞에 $이 붙은 이름은 make 변수로 간주되고 $ (셸과 같은 백 슬래시는 사용하지 않음)을 두 배로하여 $$을 작성하여 확장에서 이스케이프 처리합니다. make는 확장 중에 $ 하나를 제거합니다.

그래서 make는 LDFLAGS을 문자열 -Wl,-rpath '-Wl,$ORIGIN'으로 줄이고이를 쉘로 전달합니다.

쉘은 따옴표의 다음 단계를 제거합니다.이 경우에는 작은 따옴표입니다. 변수는 작은 따옴표 안에 확장되지 않으므로 실제로 링커는 -Wl,-rpath-Wl,$ORIGIN이라는 인수를 가져옵니다.

+0

와우 덕분에 세 단계로 도주하면 내 상처가납니다. –