[iphone] Xcode 및 SDK 4+를 사용하여 fat 정적 라이브러리 (device + simulator) 빌드


3 Answers

armv7, armv7s 및 시뮬레이터에서 작동 할 정적 라이브러리를 구축하는 데 많은 시간을 투자했습니다. 마지막으로 해결책을 찾았습니다 .

요점은 두 개의 라이브러리 (하나는 시뮬레이터 용, 다른 하나는 시뮬레이터 용)를 개별적으로 빌드하고 서로 구별하도록 이름을 바꾼 다음 라이브러리를 하나의 라이브러리로 생성하는 것입니다.

lipo -create libPhone.a libSimulator.a -output libUniversal.a

나는 그것을 시도하고 그것은 작동합니다!

Question

이론적으로 시뮬레이터와 iPhone 및 iPad를 모두 포함하는 단일 정적 라이브러리를 구축 할 수 있습니다.

그러나 Apple은이 문서를 찾을 수 없으며 Xcode의 기본 템플릿은이 작업을 수행하도록 구성되어 있지 않습니다.

나는 Xcode 내에서 수행 할 수있는 간단하고, 이식성 있고, 재사용 가능한 기술을 찾고있다.

일부 기록 :

  • 2008 년에는 sim과 device를 모두 포함하는 단일 정적 라이브러리를 만들 수있었습니다. 애플은 그것을 막았다.
  • 2009 년 한 해 동안 우리는 정적 라이브러리 쌍을 만들었습니다 - 하나는 sim 용이고 다른 하나는 장치 용입니다. 애플은 이제 그것을 무력화시켰다.

참고 문헌 :

  1. 이것은 훌륭한 아이디어이며, 훌륭한 접근 방법이지만 작동하지 않습니다. http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • 그의 스크립트에는 시스템에서만 작동하는 버그가 있습니다. "guesstimating"대신 BUILT_PRODUCTS_DIR 및 / 또는 BUILD_DIR을 사용해야합니다.
    • Apple의 최신 Xcode는 자신이 한 일을하지 못하게합니다. Xcode가 대상을 처리하는 방식이 (문서화 된) 변경으로 인해 작동하지 않습니다.
  2. 다른 SO 질문자는 xcode없이 arm6 대 arm7 부분에 초점을 맞춘 응답을 사용하여이를 수행하는 방법을 물었지만 i386 부분은 무시했습니다. armv6, armv7 및 i386에 대한 정적 라이브러리 (fat)를 어떻게 컴파일합니까?

    • Apple의 최신 변경 이후 Simulator 파트는 arm6 / arm7 차이와 더 이상 동일하지 않습니다. 이는 다른 문제입니다 (위 참조)



잘 했어! 비슷한 것을 해킹했지만 별도로 실행해야했습니다. 빌드 프로세스의 일부가되면 훨씬 간단 해집니다.

한 가지주의 사항. 나는 당신이 공개로 표시하는 포함 파일을 복사하지 않는다는 것을 알아 차렸다. 나는 내 대본에있는 내용을 너의 것에 적용 시켰고 꽤 잘 작동한다. 스크립트의 끝에 다음을 붙여 넣으십시오.

if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ]
then
  mkdir -p "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
  cp "${CURRENTCONFIG_DEVICE_DIR}"/usr/local/include/* "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
fi



IOS 10 업데이트 :

나는 스크립트의 정규식이 9.x 이하만을 기대하고 ios 10.0의 경우 0.0을 반환하기 때문에 iphoneos10.0을 사용하여 fatlib을 빌드하는 데 문제가있었습니다.

이 문제를 해결하기 위해

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$')

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '[\\.0-9]\{3,4\}$')



명령 줄 유틸리티 인 xcodebuild 있으며 xcode에서 shell 명령을 실행할 수 있습니다. 따라서 사용자 지정 스크립트 사용에 신경 쓰지 않으면이 스크립트가 도움이 될 수 있습니다.

#Configurations.
#This script designed for Mac OS X command-line, so does not use Xcode build variables.
#But you can use it freely if you want.

TARGET=sns
ACTION="clean build"
FILE_NAME=libsns.a

DEVICE=iphoneos3.2
SIMULATOR=iphonesimulator3.2






#Build for all platforms/configurations.

xcodebuild -configuration Debug -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Debug -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO







#Merge all platform binaries as a fat binary for each configurations.

DEBUG_DEVICE_DIR=${SYMROOT}/Debug-iphoneos
DEBUG_SIMULATOR_DIR=${SYMROOT}/Debug-iphonesimulator
DEBUG_UNIVERSAL_DIR=${SYMROOT}/Debug-universal

RELEASE_DEVICE_DIR=${SYMROOT}/Release-iphoneos
RELEASE_SIMULATOR_DIR=${SYMROOT}/Release-iphonesimulator
RELEASE_UNIVERSAL_DIR=${SYMROOT}/Release-universal

rm -rf "${DEBUG_UNIVERSAL_DIR}"
rm -rf "${RELEASE_UNIVERSAL_DIR}"
mkdir "${DEBUG_UNIVERSAL_DIR}"
mkdir "${RELEASE_UNIVERSAL_DIR}"

lipo -create -output "${DEBUG_UNIVERSAL_DIR}/${FILE_NAME}" "${DEBUG_DEVICE_DIR}/${FILE_NAME}" "${DEBUG_SIMULATOR_DIR}/${FILE_NAME}"
lipo -create -output "${RELEASE_UNIVERSAL_DIR}/${FILE_NAME}" "${RELEASE_DEVICE_DIR}/${FILE_NAME}" "${RELEASE_SIMULATOR_DIR}/${FILE_NAME}"

어쩌면 비효율적 인 것처럼 보일 수도 있지만 (쉘 스크립트가 좋지 않음) 이해하기 쉽습니다. 이 스크립트 만 실행하는 새 대상을 구성했습니다. 이 스크립트는 명령 행을 위해 설계되었지만 테스트되지 않았습니다. :)

핵심 개념은 xcodebuildlipo 입니다.

Xcode UI에서 많은 구성을 시도했지만 아무 것도 효과가 없었습니다. 이것은 일종의 일괄 처리이기 때문에 명령 행 설계가 더 적합하므로 Apple은 점진적으로 Xcode에서 일괄 빌드 기능을 제거했습니다. 따라서 나는 미래에 UI 기반 일괄 빌드 기능을 제공 할 것이라고 기대하지 않습니다.




Related



Tags

iphone   xcode