2009-03-12 6 views
9

현재 Qt에서 프로그램을 개발 중이며 libqextserialport.1.dylib 라이브러리를 사용하고 있습니다.Xcode에서 어떻게 동적 라이브러리를 링크 할 수 있습니까?

나는 그것을 구축하고 X-코드를 실행하고 다시 뱉어 :

dyld: Library not loaded: libqextserialport.1.dylib 
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV 
    Reason: image not found 

라이브러리는에/사용자/samuelreh/데스크탑/QtOpenCV/qextserialport/빌드/위치하고 있습니다.

내가 /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ 실행 폴더로 변경하고 입력하여 내 프로그램을 실행할 수 있습니다

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

알아요 이 외에도 많은 솔루션이있을 것입니다. 누구나 최고/가장 우아한/x 코드에서 할 수있는 가장 쉬운 방법을 알고 있습니까?

답변

2

올바르게 문제를 이해하면 앱을 올바르게 구축 할 수 있으며 링크 할 때 오류가 발생하지 않지만 실행하려고하면 라이브러리를 찾을 수 없습니다.

dylib 파일이 시스템 경로에없는 임의의 디렉토리에 있기 때문에 놀랍지 않습니다. /usr/lib (아마도 좋은 생각은 아닙니다)에 복사하거나 응용 프로그램 번들에 포함시켜야합니다. 아마 후자가 더 나은 방법 일 것입니다.

필자는 한번도 시도한 적이 없지만 Copy Files Build Phase을 사용하여 번들 안에 dylib을 넣은 다음 configure Xcode을 실행 파일이 어디에 있는지 알 수 있도록해야합니다.

+0

번들이없는 실행 파일을 작성할 경우 어떻게해야합니까? – John

0

디렉토리에서 Xcode 프로젝트로 라이브러리를 드래그하기 만하면됩니다.하지만 리소스에는 아무런 문제가 없습니다. 나는 '번들로 파일 복사'를 체크하지 않고 시도했지만 두 경우 모두 작동합니다. 배포를 위해 번들에 포함해야하는지 확실하지 않습니다.

나는 이것을 sqlite3 및 코코아 응용 프로그램 (cocoa-touch)에서 테스트했습니다.

4

모듈 번들 프로젝트로이 작업을 수행했습니다. 이것은 별도의 실행 파일이있는 더 큰 프로젝트에 포함되었습니다.

dylib를 /Foobar.bundle/Contents/Frameworks/Foobar/에 복사 한 "dylibs to frameworks"단계를 추가했습니다. 그럼 난 실행에 dylibs의 설치 이름을 해결하기 위해, 마지막 단계로 실행하는 스크립트 실행 단계를 추가 :

물론
install_name_tool -change libBobDylan.dylib @executable_path/../Plugins/Foobar.bundle/Contents/Frameworks/Foobar/libBobDylan.dylib path/to/build/product/Foobar.Bundle/Contents/MacOS/Foobar 

는 libBobDylan.dylib도 libBillyIdol.dylib에 연결. 그래서 여기에 설치 이름을 해결하기 위해 대상의 바로 그 시작에 다른 스크립트 실행 단계를 추가했다 :

install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib 

난에 연결하는 이들의 다스 이상했다; dylib의 공급 업체를 설득하여 많은 install_name 변경 사항을 수용하도록 헤더를 채워야했습니다 ...

관련 문제