2008-10-23 5 views
17

나는 Code :: Blocks IDE와 함께 GCC를 사용하여 빌드 된 실행 파일에 특수 문자열 $ ORIGIN을 포함하는 RPATH를 연결하려고합니다. 내가

프로젝트에 대한 링커 옵션에
-Wl,-R$ORIGIN 

지정되었지만 GCC의 명령 줄 출력이 잘못된 것 (명확성을 위해 제거) :

이 인수를 지정하는 올바른 방법은 무엇입니까
g++ -Wl,-R 

코드 :: 블록?

+0

관련이 있지만 코드 : 지정하지 : 블록 : http://stackoverflow.com/q/6324131/257299 – kevinarpe

답변

34

토큰 $ ORIGIN을 만들기로 결정한 사람은 누구나 프로그래머 지옥에서 특별한 자리를 차지할 가치가있는 나쁜 놈입니다. '$'는 bash와 make와 같은 다른 스크립팅 언어를위한 특수 문자이기 때문에 조심스럽게 빠져 나오지 않는 한 모든 것을 망가 뜨립니다. 더 나쁜 것은, 사용중인 빌드 환경에 따라 적절하게 탈출하는 방법이 달라질 수 있다는 것입니다.

bash는, 당신은 $ 앞에 백 슬래시를 부착해야합니다

-Wl,-R\$ORIGIN 

코드 :: 블록 분명히 특수로 $ 간주합니다. 그런 다음 어떤 하위 프로세스 컨트롤러 인 Code :: Blocks가 백 슬래시를 특수하게 처리하는 명령을 보냅니다. 따라서 백 슬래시와 $를 모두 두 번 돌려서 제대로 이스케이프 처리해야합니다. 따라서, 코드 :: 블록 링커 설정에서, 당신은 지정해야합니다 : 빌드 로그에 ...

-Wl,-R\\$ORIGIN 

하지만, 쉘이 실제로 보내지 :

-Wl,-R\\$$ORIGIN 

... 출력한다 :

-Wl,-R\$ORIGIN 

... 위에서 언급 한대로 원하는 결과를 생성합니다.

아픔.

+6

+1 악한 놈의 의견에 대한 ...이 문제는 나를 고통의 톤을 일으켰습니다 – chotchki

+0

완벽한 코멘트 그는 지옥에서 썩어야한다. –

+0

빌드 된 실행 파일을 통해 RPATH를 변경하는 방법이 있습니까? 이것은 ELF 테이블의 문자열이기 때문에 무리한 것은 아닙니다. rpath를 $ ORIGIN/yada/yada로 설정하는 것은 기존의 (아마도 horrifically 복잡한) 빌드 스크립트에 추가하고 싶은 것이고, 링커에게 옵션을 보낼 수있는 방법을 제공했다면 멋지지만 논의 된 바와 같이, 당신은 탈출 지옥을 다루어야 만합니다 (자신의 'ld'래퍼를 몰래 넣는 것이 더 쉬울 수도 있음). OTOH가 연기가 사라진 후 결과에 대한 rpaths 수정? 그리 어렵지 않습니다. 즉, 그것을 할 수있는 유틸리티가 있다면 ... – greggo

15

kblucks 이외에 Code : Blocks에 대한 질문을 대답합니다 .... 이 페이지를 우연히 발견 한 사람은 Make를 사용하여이 작업을 수행하는 방법을 찾고 있습니다. 트릭은 이스케이프 문자로 추가 $ 기호를 사용하고 따옴표로 묶어야하는 것입니다

-Wl,-R,'$$ORIGIN/../lib' 

전체 설명은 여기에서 가지게 될 수있다 : 당신의 실행 파일이 거대한에 의해 건설되는 경우 Using ORIGIN for a dynamic runtime library search path

1

복잡한 스크립트 환경은 여러분이 만들지 않았고, 당신은 그걸 탐구하고 싶지 않고, setenv LD_RUN_PATH='$ORIGIN/../lib'으로 실행하려고합니다. 문제가 해결되지 않을 경우, 실용적인 접근 방식은 LD에 대한 랩퍼를 작성하는 것입니다

#!/bin/sh 
exec /usr/bin/ld -R '$ORIGIN/../lib' "[email protected]" 

... 다음 경로에 그 스텁으로 빌드를 수행. 실제로 그것은 .so 파일이나 다른 실행 파일을 빌드하기 위해 호출 될 수 있으므로 RPATH를 삽입할지 여부를 결정하는보다 복잡한 스크립트로 만들어야 할 수도 있습니다. 또는 이것을 사용하지 않고 빌드를 실행하고 및를 선택하십시오.

(여기서 "/ usr/bin/ld"는 일반적으로 실행 된 ld이며 다른 곳에있을 수 있습니다 .gcc가 경로에서 ld를 가져 오지 않을 수 있습니다. gcc 환경 변수를 참조하십시오. 단일 용도로만 사용되며 다른 방법보다 덜 끔찍하지 않습니다.)