2013-02-18 3 views
2

GPhoto2 Framework을 사용하는 간단한 응용 프로그램을 작성했으며 프레임 워크가 원래 컴파일 된 위치에있는 한이 작업을 수행 할 수 있습니다. 그래도 별도의 설치가 필요하지 않으므로이 앱 번들 내부로 옮기고 싶습니다. 따라서이 기본 실행 파일에 상대적으로 작동하도록 만들어야합니다.install_name_tool을 사용하여 프레임 워크를 비공개로 만들기

프레임 워크는 Xcode 프로젝트가 아닙니다. 그것은 스크립트를 사용하여 빌드를하기 때문에 설치 디렉토리 빌드 설정을 간단히 변경할 수는 없습니다.이 설정은 응답을 검색하는 동안 자주 보았던 솔루션입니다. Xcode와 Mac 프로그래밍에 익숙하지 않기 때문에 프레임 워크를 Xcode 프로젝트로 변환하는 방법을 아는 것도 불가능합니다.

다른 조언은 install_name_tool을 사용하여 라이브러리 ID와 종속성을 업데이트하고 절대 경로를 "@executable_path /../ Frameworks/GPhoto2.framework"형식으로 바꾸는 것이 었습니다. 이 프레임 워크는 단일 바이너리는 아니지만 여러 개의 .dylib 및 .so 라이브러리가 포함되어 있지만이 모두를 업데이트하면 절반 만 성공한 것입니다.

빌드 할 때 프레임 워크를 응용 프로그램 번들로 복사하도록 Xcode를 설정했습니다. 그런 다음 원래 컴파일 된 위치에서 프레임 워크를 제거하면 응용 프로그램이로드되지 않고 OS X에서 생성 된 libgphoto2 라이브러리를 더 이상 발견 할 수 없다는 보고서가 예상대로 표시되지 않습니다.

그런 다음 install_name_tool을 사용하여 응용 프로그램 번들 내의 모든 프레임 워크 라이브러리와 응용 프로그램 바이너리 자체의 참조를 업데이트하면 응용 프로그램은로드되지만 연결된 모든 카메라를 찾지 못합니다. otool 사용 모든 참조가 올바르게 변경되었는지 확인할 수 있습니다.

프레임 워크의 복사본을 원래 위치로 바꾼다면 해당 프레임 워크가 상대적 위치 또는 절대 위치를 사용하는지 여부에 관계없이 연결된 카메라를 인식하여 올바르게 다시 작동합니다. 분명히 그것은로드에도 불구하고 여전히이 위치를보고 있습니다. 나는 개별 라이브러리 파일을 원래 위치의 프레임 워크에서 차례로 제거하여 문제가 이러한 종속성의 결과인지 여부를 확인하려고 시도했지만 응용 프로그램이 누락 된 경우에도 작동하지 않습니다.

덧붙여 말하면, 프레임 워크의 업데이트 된 버전을 사용하여 응용 프로그램을 빌드하면 "@executable_path /../ Frameworks/GPhoto2.framework/prefix/lib/libgphoto2.2.dylib"라이브러리를 찾을 수 없다는 오류가 발생합니다.

뭔가 잘못하고 있거나 단계가 누락되었거나 Xcode 외부에서 생성 된 프레임 워크에서 불가능한 일을하려고합니까?

+0

추가 조사 후 특정 문제를 발견했습니다. 파일 테스트를 통해 파일을 원래 프레임 워크 위치에 있어야하는지 확인하기 위해 불행하게도 하드 코딩 된 경로가 필요했습니다. 그래서 사설 프레임 워크는 하드 코딩 된 의존성을 가진 무언가를로드하여 요구 사항에 잘못된 인상을주었습니다. – Michael

+0

죄송합니다. 주석은 새로운 줄을 포함 할 수 없습니다. 원래 위치의 유일한 요구 사항은 .so 파일입니다. 문자열을 사용하면 위치가 특정 라이브러리에 하드 코드되어 있음을 확인할 수 있습니다. 업데이트 할 수있는 공식 방법이 있습니까? 그렇지 않다면 바이너리 편집기로 상대 경로로 경로를 덮어 쓰는 것이 가능하다. – Michael

답변

0

누군가가이 미래를 겪을 경우, 제 질문에 대한 대답은 제가 잘못한 것이 아니 었습니다. 문제는 .so 파일이 libtool ltdl에 의해로드되고 있었기 때문에 빌드시에 절대 경로가 필요하다는 것입니다.

gphoto2-abilities-list.c 및 gphoto2-port-info-list.c 파일에 패치를 적용하여 런타임에 관련 라이브러리 경로와 실행 가능 위치가 결합되도록했습니다. 결과적으로 메일 응용 프로그램 (예 : 데스크탑)을 실행할 수 있도록 FILENAME_MAX 상수를 늘려야했습니다. 그러나 이것은 install_name_tool의 사용과 함께 외부 종속성을 필요로하지 않고 GPhoto2를 내 응용 프로그램 내부의 프레임 워크로 추가 할 수있었습니다.

install_name_tool을 사용한 후 프레임 워크에서 Xcode에서 내 응용 프로그램을 빌드 할 수 없다는 최종적인 문제가 남아 있지만 원래 프레임 워크 빌드를 사용한 다음 컴파일 후 동일한 프레임 워크에서 참조를 업데이트했습니다. 시간은 내가 메인 실행 파일에있는 것들을 업데이트했다.