2011-02-28 2 views
1

나는 내 응용 프로그램이 실행중인 컴퓨터에 있어야합니다 라이브러리 libmysqlclient.16.dylib을 가지고, 또는 나는 다음과 같은 오류가 발생합니다 :Cocoa 응용 프로그램 내에서 라이브러리를 묶는 방법은 무엇입니까?

나는이 라이브러리와 바이너리를 연결하기 때문에 이것은 매우 이상하다

Dyld Error Message: Library not loaded: /usr/local/mysql/lib/libmysqlclient_r.16.dylib Referenced from: /Users/alex/snow server 3.app/Contents/MacOS/snow server Reason: image not found

.

Dyld Error Message: Library not loaded: /usr/local/mysql/lib/libmysqlclient_r.16.dylib Referenced from: /Users/alex/snow server 3.app/Contents/MacOS/snow server Reason: no suitable image found. Did find: /usr/local/mysql/lib/libmysqlclient_r.16.dylib: mach-o, but wrong architecture

나는에 연결하고 싶습니다 :

같은 dylib가 대상 컴퓨터에 존재하지만 다른 버전 (예를 들어, 스노우 레오파드 서버에 대한), 나는 다음과 같은 오류가 발생하는 경우

이 라이브러리는 로컬 복사본을 사용할 필요가 없습니다. 이것이 가능한가?

bash-3.2# otool -L libmysqlclient.16.dylib libmysqlclient.16.dylib: libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0) bash-3.2# install_name_tool -change libmysqlclient.16.dylib @executable_path/../Frameworks/libmysqlclient.16.dylib Usage: install_name_tool [-change old new] ... [-rpath old new] ... [-add_rpath new] ... [-delete_rpath old] ... [-id name] input bash-3.2# install_name_tool -change libmysqlclient.16.dylib @executable_path/../Frameworks/libmysqlclient.16.dylib libmysqlclient.16.dylib bash-3.2# otool -L libmysqlclient.16.dylib libmysqlclient.16.dylib: libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)

솔루션 내가 빌드 단계에 스크립트를 추가했다 : -

UPDATE 내가 install_name_tool을 사용하려고 할 때 어떤 변화가없는 install_name_tool -change libmysqlclient.16.dylib @ executable_path /../ Frameworks/libmysqlclient.16.dylib $ CONFIGURATION_BUILD_DIR/$ PRODUCT_NAME.app/Contents/MacOS/$ PRODUCT_NAME 이 제품은 실행 제품 용 libpath가 수정되어 lib 번들과 함께 잘 작동합니다.

답변

1

먼저이 라이브러리를 응용 프로그램 번들에 복사하여 사용자 컴퓨터에서 사용할 수 있도록해야합니다. 이렇게하려면 번들로 제공되는 프레임 워크를 복사하기 위해 응용 프로그램에 대해 파일 복사 빌드 단계를 새로 추가하십시오. 해당 빌드 단계의 특성에서 대상이 Frameworks인지 확인하십시오. 라이브러리를 프로젝트에서 해당 빌드 단계로 드래그하여 응용 프로그램과 함께 패키지화되었는지 확인하십시오.

응용 프로그램 번들 내의 올바른 위치를 가리 키도록 라이브러리 자체를 수정해야 할 수도 있습니다. 과거에는, 나는 도서관이 자신을 찾을 것으로 예상 위치를 수정하려면 다음 명령을 사용하여 다음, 내 프로젝트의 디렉토리에 라이브러리의 사본을 만들어 이런 짓을 한 :이 경우

install_name_tool -id @executable_path/../Frameworks/libftd2xx.0.1.0.dylib libftd2xx.0.1.0.dylib 

라이브러리가되는 수정 된 내용은 libftd2xx.0.1.0.dylib입니다.

당신은 라이브러리 자체가 발견이 변경 될 필요가 있는지를 결정 할 것으로 예상 경로를 확인하기 위해 명령

otool -L [library filename] 

를 사용할 수 있습니다.

Xcode 프로젝트 내에서 라이브러리의 경로를 변경하여 프로젝트 디렉토리에있는 라이브러리의 새 버전을 링크 할 수 있는지 확인하십시오.

+0

libmysql.a를 사용한다면 - 동적 로딩없이 라이브러리에 코드가있을 것이므로 어떤 복사본도 만들 필요가 없다는 뜻입니까? – Alex

+0

@Alex - 예, 정적 라이브러리를 사용하는 경우 바이너리에 링크됩니다. 그러나 라이브러리의 라이센스에주의하여 응용 프로그램을 오염시키지 않도록하십시오. 먼저 기본 버전이 GPL이기 때문에 MySQL의 LGPL 버전 중 하나를 사용해야합니다 : http://www.mysql.com/about/legal/licensing/index.html. LGPL 정적 라이브러리를 링크하는 경우 LGPL 라이센스를 준수하기 위해 응용 프로그램의 객체 파일을 릴리스해야 할 수 있습니다. 확률은 당신이 여기서 MySQL의 GPL 버전을 사용하고 있기 때문에 상업용 라이센스 비용을 지불해야합니다. –

+0

tnx,하지만 난 말을하고 오류가있다 : dyld : 라이브러리가로드되지 않았습니다 : libmysqlclient.16.dylib 참조 :/사용자/맥/라이브러리/개발자/Xcode/DerivedData/snow-dnqbsbmaqlhtddanrxjajfdqlqtf/빌드/제품/디버그/스노우 server.app/Contents/MacOS/snow 서버 이유 : 이미지를 찾을 수 없습니다. 파일 복사 단계를 추가하고 libmysqlclient.16.dylib (대상 - 프레임 워크)를 추가하십시오. – Alex

관련 문제