2011-07-03 2 views
154

편의를 위해 아래 관련 맨 페이지를 추가했습니다.-Wl, -rpath -Wl,

내 (잘못) 이해 첫째 : 나는 그것이 -rpath 옵션에 대한 인수 의미 , 전에 오기 때문에 두 번째 -Wl 다른 옵션이 아닌 것을 의미, ,으로 옵션을 구분해야하는 경우.

나는 이 -Wl,. 인수를 가질 수있는 방법을 모르겠다! 내 마음의 감각을 만들 것입니다 무엇

이 될 것입니다 :

-Wl,-rpath . 

이 현재 디렉토리 인수 -rpath 링커 옵션을 호출해야합니다.


남자 GCC :

-Wl, 옵션 링커 옵션으로

패스 옵션을 선택합니다. 옵션에 쉼표가 포함되어 있으면 은 쉼표로 여러 옵션으로 분할됩니다. 이 구문을 사용하여 옵션에 인수를 전달할 수 있습니다. 의 경우, -Wl,-Map,output.map-Map output.map을 링커에 전달합니다. GNU 링커를 사용하면 도 `-Wl, -Map = output.map '과 동일한 효과를 얻을 수 있습니다.

남자 LD :

-rpath =이 디렉토리

가 런타임 라이브러리 검색 경로에 디렉토리를 추가합니다. ELF 실행 파일 을 공유 객체에 연결할 때 사용되는 입니다. 모든 -rpath 인수는 연결되어 으로 런타임 링커에 전달되며 런타임 링커는 을 사용하여 런타임에 공유 객체를 찾습니다. 공유 객체가 인 공유 객체를 명시 적으로 찾을 때 -rpath 옵션을 사용하면 공유 객체에 명시 적으로 이 포함됩니다.

답변

182

링커 인수의 공간 분리 된리스트로서 토큰 쉼표로 구분 전달GCC의 -Wl,xxx 옵션.그래서

gcc -Wl,aaa,bbb,ccc 

결국 링커 전화를 귀하의 경우

ld aaa bbb ccc 

이되고, 당신은 당신이 -Wl의 반복 인스턴스를 지정할 수 있습니다, 또는 -Wl,-rpath,.로 GCC이 통과하므로, "ld -rpath ."를 말하고 싶은 : aaa 및 제 -Wl 사이 쉼표가 없다는

gcc -Wl,aaa -Wl,bbb -Wl,ccc 

참고.

또는 귀하의 경우 -Wl,-rpath -Wl,..

+4

아, 지금은 링커에 물건을 전달하는 동안 옵션이나 인수 사이에 차별이 없다는 것을 이해합니다. 단지 문자열 일뿐입니다. 따라서 두 번째 -Wl은 중복됩니다! 감사합니다 :) – Blub

+21

@Blub : 중복되지 않습니다! 그것은 대체 형식입니다. 여러분은'-Wl, -rpath, .' * 또는 * -Wl, -rpath -Wl, .'라고 말합니다. 정확히 두 가지 중 하나, 당신은 아무것도 생략 할 수 없습니다. –

7

설명서 페이지는 매우 명확합니다. 당신이 링커에 대한 두 개의 인수 (-rpath.)를 전달하려는 경우 당신은 내 마음 이해가되지 않는 제안 -Wl,-rpath .

-Wl,-rpath,. 

또는 대안

-Wl,-rpath -Wl,. 

인수를 작성할 수 있습니다. gcc는 두 번째 인수 (.)가 정상적으로 해석되는 대신 링커에 전달되어야한다고 어떻게 알 수 있습니까? 가능한 경우 알 수있는 유일한 방법은 가능한 링커 인수에 대한 내부적 인 지식이 있으므로 -rpath 뒤에 인수가 필요하다는 것을 알았습니다.

+0

gcc가 인수를 분석한다는 것은 상상도 할 수 없으며 어떤 것이 의미가 없으면 자동으로 그룹화됩니다. – Blub

+10

실제로, 그것은 –

29

다른 하나. 당신은 -L 옵션을 지정해야 할 수도 있습니다 뿐만 아니라 - 예를 들어

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz 

또는 당신은 또한으로

-Wl,-rpath=. 

를 작성할 수

ld: cannot find -lbaz 
50

과 같은 오류와 함께 종료 될 수 있습니다 그 성가신 공간을 제거하십시오. 그것은 쉼표를 추가하는 것보다 논란의 여지는 있지만 (정확하게 ld에 전달되는 것입니다).

+0

입니다. 데비안 및 Fedora 맨 페이지는 이런 식으로 지정합니다. – jww

관련 문제