2009-11-23 3 views
13

코드 재사용을 위해 여러 라이브러리로 분리 된 응용 프로그램이 있습니다. Windows에서 실행 파일과 동일한 경로에 .dll 파일을 넣으면 자동으로 찾습니다. 리눅스에서는 (환경에 대한 경로를 하드 코드하기 때문에) 환경 변수 LD_LIBRARY_PATH을 지정하거나 실행 파일 앞에 라이브러리를 미리로드해야합니다.실행 가능 디렉토리로 공유 라이브러리 경로

나는 링커 옵션 -Wl,-rpath=<PATH>을 사용하여 경로를 포함하는 것에 대해 몇 가지를 보았으며 경로로 .을 사용해 보았습니다. 하지만 현재 실행중인 디렉토리가 아니라 실행 파일의 디렉토리를 볼 수 있습니다.

기본적으로 공유 라이브러리에 대한 실행 파일의 디렉토리를 링커에서 확인하는 방법이 있습니까 (예 : Windows)?

감사합니다. Matt

답변

18

ld 또는 기타 Darwin 도구에 적절한 옵션을 통해 RPATH에 $ ORIGIN이 필요합니다. thisthis을 참조하십시오.

$는 실제로 경로에서 끝나야하므로 링크 명령 줄에서 $를 인용하거나 이스케이프해야합니다.

업데이트 :

0x0000000f (RPATH)    Library rpath: [$ORIGIN] 
+4

$ ORIGIN을 사용하는 경우 링커가 실제로 볼 수 있도록 $가 제대로 인용되어 있는지 확인해야합니다. 명령 줄에서 "-rpath \ $ ORIGIN"을 입력하고 Makefile에서 "-rpath \ $$ ORIGIN"을 입력하십시오. –

+0

Eclipse와 CDT를 사용하고 있으며 기타 링커 플래그 아래에 옵션을 넣을 것입니다. '-Wl, -rpath = $$ ORIGIN'을 넣었고 출력 창에 $로 표시됩니다. 그러나 그것은 효과가없는 것처럼 보입니다. 여러 변형을 시도했지만 아무 일도 일어나지 않습니다. 링커가 플래그를 무시하는 것과 같습니다. 나는 시도했다 : -Wl, -rpath = $ ORIGIN -Wl, - RPATH = $ ORIGIN -Wl, -rpath =/$ ORIGIN -Wl, -rpath = $ ORIGIN/ -Wl, -rpath =/$ ORIGIN/ 등 – CuppM

+0

거기에 무엇이 있는지 보려면 elfdump 또는 해당 지역의 동일한 기능을 사용하십시오. ldd를 사용하고 그것이 무엇을 말하는지 보아라. – bmargulies

2

쉘 스크립트에서 프로그램을 랩 : 당신은 링커가 실제로 여기에

readelf -d /path/to/exe | grep RPATH 

으로 실행에 넣어 무엇을 볼 수는 출력이 어떻게 보일지입니다 :

#!/bin/sh 

PROGRAM_DIRECTORY="`dirname "$0"`" 
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY" 

"$PROGRAM_DIRECTORY/program_executable" "[email protected]" 

실행 파일 대신이 스크립트를 실행하면 y 우리 프로그램은 잘 연결될 것입니다.

+0

그래, 그게 내가 해왔 던 일이야. 응용 프로그램은 OpenMPI를 사용하여 병렬화 된 버전을 가지고 있으며 LD_LIBRARY_PATH를 공유하는 방법이 있습니다. 그래서 우리는 현재 그 해결 방법을 사용하고 있습니다 만, MPI 러너뿐만 아니라 응용 프로그램이 처리 할 여러 플래그를 취하기 때문에 더 쉬운 방법을 원합니다. – CuppM

+0

스크립트의 모든 인수를 다음과 같은 프로그램에 전달할 수 있습니다. ''$ @ ''. –