문제

코드 :: Blocks IDE와 함께 특수 문자열 $ 원점을 포함하는 rpath를 GCC를 사용하여 빌드 된 실행 파일로 연결하려고합니다. 지정했습니다

-Wl,-R$ORIGIN

프로젝트의 링커 옵션에서는 GCC에 대한 명령 줄 출력이 잘못되었습니다 (명확성을 위해 제거) :

g++ -Wl,-R

코드 :: 블록 에이 인수를 지정하는 올바른 방법은 무엇입니까?

도움이 되었습니까?

해결책

Token $ Origin을 만들기로 결정한 사람은 프로그래머 지옥에서 특별한 장소를 가질 자격이있는 사악한 놈입니다. '$'는 Bash 및 Make와 같은 다른 스크립팅 언어의 특수한 캐릭터이므로 조심스럽게 탈출하지 않으면 모든 것을 망칩니다. 더 나쁜 것은, 당신이 사용하는 건축 환경에 따라, 제대로 탈출하는 방법에 대한 세부 사항이 변할 것입니다.

Bash에서는 $ : 앞에 백 슬래시를 붙여야합니다.

-Wl,-R\$ORIGIN

코드 :: 블록은 분명히 $를 특별한 것으로 취급합니다. 그런 다음 하위 프로세스 컨트롤러 코드 :: 블록이 무엇이든 Backslash를 특별한 것으로 취급하기 위해 명령을 보냅니다. 따라서 Backslash와 $를 제대로 탈출하려면 두 배가되어야합니다. 따라서 코드 :: 블록 링커 설정에서 다음을 지정해야합니다.

-Wl,-R\\$$ORIGIN

... 출력 :

-Wl,-R\\$ORIGIN

... 빌드 로그에 있지만 쉘은 실제로 전송됩니다.

-Wl,-R\$ORIGIN

... 위에서 언급 한 바와 같이 원하는 결과를 생성합니다.

얼마나 고통 스러운가.

다른 팁

코드 : 블록에 대한 질문을 다루는 kblucks 답변 외에도이 페이지를 우연히 발견 한 사람들을 위해 Make와 함께이 작업을 수행하는 방법을 찾고 있습니다. 트릭은 추가 $ 표시를 탈출 문자로 사용하고 인용문으로 둘러싸는 것입니다.

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

전체 설명은 다음과 같습니다.동적 런타임 라이브러리 검색 경로에 원점을 사용합니다

귀하의 실행 파일이 귀하가 만들지 않은 거대한 복잡한 스크립트 환경에 의해 구축되고 있다면, 당신은 그것으로 탐구하고 싶지 않습니다. setenv LD_RUN_PATH='$ORIGIN/../lib'; 그렇지 않은 경우 실용적인 접근 방식은 LD 용 래퍼를 만드는 것입니다.

#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"

... 그런 다음 경로에 그 스터브를 사용하여 빌드를하십시오. 실제로는 .so 파일 또는 기타 실행 파일을 빌드하도록 호출 될 수 있으므로 rpath를 삽입할지 여부를 결정하는보다 복잡한 스크립트를 만들어야 할 수도 있습니다. 또는 이것없이 빌드를 실행하고 체리 선택하십시오.

(여기서 "/usr/bin/ld"는 일반적으로 실행되었을 수있는 LD입니다. 다른 곳에서있을 수 있습니다. GCC는 경로에서 LD를 픽업하지 않을 수 있습니다. GCC 환경 변수를 참조하여이를 재정의 할 수 있습니다. 마일리지는 단일 용도로 다를 수 있습니다. 만. 다른 접근법보다 덜 끔찍한 것이라는 것이 보증되지 않습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top