2013-02-15 4 views
1

Xcode 및 Mac 환경을 처음 사용합니다. 나는 응용 프로그램의 DYLD_LIBRARY_PATH으로이 경로를 설정할Xcode에서 dyld_library_path를 설정하는 방법

MyApp.app/Contents/Resources

에서 나는 모든 라이브러리가 등 부스트, Clucene, 같은 일부 동적 및 정적 라이브러리를 사용하고 있습니다 . 나는

DYLD_LIBRARY_PATH/MYPATH/XXX

같은 XXX.plist 파일을 편집하고 엑스 코드 아무것도 작업의 환경 변수 및 인수를 설정했습니다. 내 .dmg를 두 번 클릭하지 않고 다음과 같은 응용 프로그램을 쉘 스크립트를 실행하는 경우

하지만 내가이이 작업을 수행 할 수있는 적절한 방법이 아니다 확신

#!/bin/bash 
clear 
cd /Volumes/xxx/myapp.app/Contents/MacOS 
export DYLD_LIBRARY_PATH="/Volumes/xxx/myapp.app/Contents/Resources" 
./myapp 

작동합니다. 내 애플 리케이션을 실행할 때마다 dyld_library_path를 설정할 수있는 적절한 방법이 있습니까?

EDIT : 또한 클라이언트가/usr/lib 경로에 모든 UR 라이브러리를 수동으로 복사하는 경우에도 작동합니다.이 방법도 적절하지 않습니다.

답변

10

설정 DYLD_LIBRARY_PATH은이 문제를 해결하는 최선의 방법은 아닙니다. 귀하가 귀하의 도서관을 어디에서 찾을 수 있는지에 대해 당신이 잘못 알고 있다는 사실을 주위에 일하고 있습니다.

otool -L MyApp.app/Contents/MacOS/MyApp을 실행하면 MyApp에서로드하려는 라이브러리의 경로가 표시됩니다. 지정된 경로에 라이브러리가 없으면 dyldDYLD_FALLBACK_LIBRARY_PATH으로 지정된 위치에서 라이브러리를 찾습니다. DYLD_LIBRARY_PATH을 설정하면 dyld이 위의 otool 명령이 반환 한 경로보다 지정된 위치에서 라이브러리를 찾습니다.

이 문제를 해결하는 가장 좋은 방법은 응용 프로그램에 DYLD_LIBRARY_PATH 설정이 필요하지 않도록 라이브러리의 올바른 위치를 지정하도록하는 것입니다. 이렇게하려면 다음을 수행해야합니다

  1. 당신이 @rpath -relative 값으로 응용 프로그램 내에서 번들하고있는 각 라이브러리의 라이브러리 식별자를 설정합니다. install_name_tool -id @rpath/libFoo.dylib libFoo.dylib을 사용하면됩니다.
  2. 응용 프로그램 랩퍼에 라이브러리를 복사하려면 파일 복사 빌드 단계를 추가하십시오. MyApp.app/Contents/Frameworks은 일반적인 위치입니다. 바이너리는 일반적인 의미의 자원이 아니므로 MyApp.app/Contents/Resources은 피해야합니다.
  3. 응용 프로그램을 연결할 때 실행 경로 검색 경로를 지정하십시오. 그러면 모든로드 명령에서 _ 생한 임의의 @rpath 변수를 해결하는 데 사용할 경로 목록이 링커에 제공됩니다. 라이브러리를 MyApp.app/Contents/Frameworks으로 복사하는 경우 실행 경로 검색 경로를 @loader_path/../Frameworks으로 지정해야합니다. 응용 프로그램 대상의 Xcode에서 LD_RUNPATH_SEARCH_PATHS (Runpath Search Paths) 구성 설정을 통해이 작업을 수행 할 수 있습니다.

당신이 할 수 있어야 모든 일을 후 위에서 언급 한 및 라이브러리에 대한 경로가 @rpath -relative 경로를 사용하고 있는지 볼 수있는 otool 명령를 다시 실행합니다.otool -lV MyApp.app/Contents/MacOS/MyApp을 실행하고 값으로 지정된 LC_RPATH로드 명령을 볼 수 있어야합니다. 마지막으로, 응용 프로그램을 실행하고 DYLD_LIBRARY_PATH을 설정하지 않고 Frameworks 디렉토리에서 라이브러리를 찾을 수 있어야합니다!

관련 문제