2011-01-13 5 views
31

일부 dylib를 성공적으로 호출하는 응용 프로그램 (실행 파일)을 만들었지 만 dylib 파일과 실행 파일은 다른 디렉토리에 있습니다. $ PATH 환경 변수에 dylib 파일이 들어있는 디렉토리를 추가했지만 여전히로드되지 않습니다. 모든 dylib 파일을 실행 파일에 복사하면 프로그램이 마침내 실행됩니다. 이것은 dylib 파일에 문제가 없음을 확인합니다. 그러나 OS에서 어떻게 찾을 수 있습니까? Windows에서 $ PATH에 dll 파일이 들어있는 디렉토리 경로를 추가하기 만하면됩니다. Mac OS X에서는 무엇이 필요합니까? 감사합니다.Mac OS X에서 dylib 사용 방법 (C++)

+4

'otool -L 앱'을 사용하여 앱의 종속성을 확인하십시오. 절대 경로로 하드 코드 된 경우'install_name_tool -change old new file'을 사용하여 상대 경로가되도록 수정하십시오. 그런 다음 링커는'DYLD_LIBRARY_PATH' 환경 변수에서 라이브러리를 찾을 수 있습니다. – aponomarenko

답변

2

dylib가 라이브러리의 INSTALL_NAME에 지정된 위치에 있으면 Just Work *가됩니다.

그렇지 않은 경우 dylib의 위치를 ​​DYLD_LIBRARY_PATH에 추가 할 수 있습니다. dyld documentation을 읽어 보시기 바랍니다.

*)가 완전히 정확하려면 DYLD_ROOT_PATH/INSTALL_NAME에 있어야하지만 DYLD_ROOT_PATH를 사용하는 것은 매우 드뭅니다.

+0

죄송합니다. "도서관의 INSTALL_NAME"은 무엇입니까? DYLD_LIBRARY_PATH를 추가하면 작동하지 않으므로 혼란 스럽습니다. –

+0

변수를 내 보내야합니다 : export DYLD_LIBRARY_PATH =/usr/local/lib' – Michel

13

DYLD_LIBRARY_PATH 환경 변수를 설정해야합니다. dyld man page에서

:

 This is a colon separated list of directories that contain libraries. The dynamic linker 
     searches these directories before it searches the default locations for libraries. It allows 
     you to test new versions of existing libraries. 

     For each library that a program uses, the dynamic linker looks for it in each directory in 
     DYLD_LIBRARY_PATH in turn. If it still can't find the library, it then searches DYLD_FALL- 
     BACK_FRAMEWORK_PATH and DYLD_FALLBACK_LIBRARY_PATH in turn. 
+0

감사합니다! 또한 Google에서 찾았지만 DYLD_LIBRARY_PATH를 설정했지만 문제가 해결되지 않았습니다. 나는 매우 혼란 스럽다. –

+0

방금 ​​시도해 보니 내 Mac에서 잘 작동한다. – EmeryBerger

+0

안녕하세요, EmeryBerger, DYLD_LIBRARY_PATH 변수가 원래 비어 있습니다. 내 것이. 처음에 이것이 틀린 지 나는 모른다. –

34

저스틴 제공하는 링크를 읽은 후, 나는 성공적으로 내 실행 파일이 위치한 동일한 디렉토리를 가리 키도록 내 dylib의 install_name을 변경하려면 @executable_path 토큰을 사용할 수 있었다.

@executable_path 절대 경로는 성가신입니다. 때로는 프레임 워크를/Library 또는 비슷한 위치에 설치해야하는 대신 프레임 워크를 응용 프로그램에 임베드하려고합니다.

Mac의 해결책은 @executable_path입니다. 이것은 라이브러리의 설치 이름의 시작 부분에 배치 될 때 인데, 은로드하는 실행 파일의 경로에서 마지막 구성 요소 인 을 뺀 경로로 확장됩니다. 예를 들어 Bar.app가 Foo.framework에 링크한다고 가정 해 보겠습니다. Bar.app가/Applications에 설치된 경우 @executable_path가 /Applications/Bar.app/Contents/MacOS로 확장됩니다. 프레임 워크를 Contents/Frameworks에 포함하려는 경우 은 Foo.framework의 설치 이름을 @executable_path /../ Frameworks/Foo.framework/Versions/A/Foo로 설정할 수 있습니다. 동적 링커는 /Applications/Bar.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo 으로 확장하여 프레임 워크를 찾을 수 있습니다.

http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html

나는 예제를 보여줄 것입니다.

의가/I는 다음과 같은 실행 /옵션/지방/빈이 있다고 변환을하고 dylibs이 /옵션 /에 lib 디렉토리/로컬 보자. 다른 dir에 복사하고 실행 파일을 복사 한 디렉토리와 동일한 디렉토리에서 dylib를로드하려고합니다.

> mkdir ~/tmp/bin 
> cp /opt/local/bin/convert ~/tmp/bin 

받기 실행 파일의 목록

> otool -L ~/tmp/bin/convert 
~/tmp/bin/convert: 
    /opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
    /opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0) 
    /opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0) 
    /opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0) 
    /opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0) 
    /opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0) 
    /opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6) 
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6) 
    ... 

나는 단지 /옵션/지역/lib에 디렉토리에서 dylibs 걱정, 그래서 우리는 만 dylibs를 꺼내/을 선택 dylibs . 나는 다른 모든 dylib 참조를 특히 /usr/lib/libSystem에 그대로 유지하려고합니다.

> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F' ' '{ print $1 }'` 

실행 파일이 복사 된 동일한 dir에 실행 파일이 참조하는 모든 dylib를 복사하십시오.

> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done; 

우리가 위의 단계에서 꺼내 모든 dylibs의 설치 이름을 변경 install_name_tool를 사용하고 dylib 이름으로 @executable_path를 앞에 붙이는 교체합니다. 이렇게하면 동적 링커가 실행 파일이있는 디렉토리와 동일한 디렉토리에서 dylib를 찾습니다. 이름을 설치

> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done; 

확인이 변경되었습니다 및 libSystem 여전히 는/usr/lib 디렉토리/libSystem를 가리키고 있는지.

> otool -L ~/tmp/bin/convert 
~/tmp/bin/convert: 
    @executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
    @executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0) 
    @executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0) 
    @executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0) 
    @executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0) 
    @executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0) 
    @executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6) 
    @executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6) 
    ... 
+0

절대 경로에 대한 링크가 포함될 수 있으므로 각 라이브러리 파일에도이 작업을 수행해야합니다. – Claudiu