문제

나는 프로그램이 있습니다(구체적으로 SO DevDays 카운트다운 앱 챌린지) 이는 libSDL, libSDL_ttf 등과 같은 여러 동적 라이브러리에 의존합니다.이 라이브러리가 아래에 설치되어 있습니다. /opt/local/lib MacPorts를 통해, 많은 사람들이 이것을 설치하지 않을 것입니다. (어떤 사람들은 그것을 설치했지만 그 위치에는 없을 수도 있습니다.)

이러한 라이브러리가 설치되지 않은 사람들이 즉시 실행할 수 있도록 프로그램을 배포하려면 어떻게 해야 합니까?분명히 다양한 것을 배포해야 할 것입니다. .dylib 하지만 이렇게 하는 것만으로는 충분하지 않습니다.동적 로더는 내가 설치한 위치에 설치된 라이브러리를 계속 찾습니다.Windows가 DLL을 사용하는 것처럼 동적 로더에게 실행 파일의 현재 디렉터리를 찾도록 지시하는 방법이 있습니까?사람들은 환경 변수(예: DYLD_LIBRARY_PATH), 다시 한 번 말씀드리지만 저는 이것이 기본적으로 작동하기를 원합니다.

도움이 되었습니까?

해결책

말씀하신 것처럼 Xcode를 사용하지 않으시므로 조금 어렵습니다.내가 선호하는 순서대로 옵션은 다음과 같습니다.

  1. Xcode로 전환하세요.프레임워크를 사용하세요.SDL 라이브러리는 이미 프레임워크로 사용 가능하며 앱 번들 내에 libsdl.framework가 포함된 상용 게임을 몇 개 이상 보았습니다.

  2. 프레임워크를 사용하되 Makefile은 유지하세요.SDL 라이브러리의 프레임워크 버전을 다운로드하고(또는 직접 빌드) -framework 링커 플래그를 사용하여 연결하세요.앱과 함께 프레임워크를 배포하거나 배포하지 않고 사용자에게 ~/Library/Frameworks 또는 /Library/Frameworks에 배치하도록 지시하세요.나는 이것을 위해 설치 프로그램을 귀찮게하지 않을 것입니다.

  3. SDL에 대해 정적으로 링크합니다.Makefile에서 -l 플래그를 사용하는 대신 정적 라이브러리의 경로를 나열해야 합니다. 예를 들어 "ld blah blah /opt/local/lib/libsdl.a"를 실행합니다.-l에게 공유 라이브러리보다 정적 라이브러리를 선호하라고 지시할 방법이 없습니다. 그리고 저를 믿으세요.

다른 팁

이에 대한 기본 접근 방식은 .app 번들로 제공하는 것입니다.그런 다음 링커가 이를 포함하도록 공유 라이브러리를 찾는 위치를 수정합니다.

단계는 다음과 같습니다.

  1. 해당 파일을 .app 번들의 Frameworks 디렉터리에 복사하는 대상에 대한 새 파일 복사 빌드 단계를 만듭니다.

  2. 포함하도록 빌드 구성 설정 "Runpath Search Paths"를 편집합니다. @executable_path/../Frameworks

이러한 변경 사항을 적용하여 실행 파일을 빌드한 다음 살펴보면 dylib가 Foo.app/Contents/Framework 디렉토리 및 실행 중 otool -L Foo.app/Contents/MacOS/Foo 해당 dylib에 대해 @rpath 접두사가 붙은 항목을 생성해야 합니다.

이것으로부터 코코아빌더 포스트:

일반적으로, @loader_path 것보다 선호된다 @executable_path, 그것으로
임베디드 프레임워크가 실행 파일과 번들 모두에서 작동하도록 허용합니다.
플러그인 또는 하위 프레임워크.유일한 단점은 @loader_path
10.4 이상이 필요합니다.10.5 이상을 사용하는 경우 @rpath 짝수이다
보다 낫다 @loader_path.

라이브러리를 정적으로 연결합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top