대안 :
최신 버전의 간편한 복사 / 붙여 넣기 (설치 지침이 변경 될 수 있음-아래 참조)
Karl의 라이브러리 는 설정하는 데 훨씬 더 많은 노력이 필요하지만 훨씬 더 좋은 장기 솔루션입니다 (라이브러리를 Framework로 변환합니다).
이것을 사용하고 그것을 조정하여 아카이브 빌드에 대한 지원을 추가하십시오 -cf @Frederik의 아카이브 모드에서 잘 작동하기 위해 그가 사용하는 변경 사항에 대한 아래의 주석.
최근 변경 사항 : 1. iOS 10.x 지원 추가 (이전 플랫폼 지원 유지)
이 스크립트를 다른 프로젝트와 함께 프로젝트에 포함시키는 방법에 대한 정보 (내가 그렇게하지 않는 것이 좋습니다)-Xcode에서 프로젝트를 서로 삽입하면 Apple은 Xcode에 몇 가지 쇼 스토퍼 버그가 있습니다. 3.x에서 Xcode 4.6.x까지)
번들을 자동으로 포함 할 수있는 보너스 스크립트 (예 : 라이브러리에서 PNG 파일, PLIST 파일 등 포함)-아래 참조 (아래로 스크롤)
이제 iPhone5 (리포의 버그에 대한 Apple의 해결 방법 사용)를 지원합니다. 참고 : 설치 지침이 변경되었습니다 (나중에 스크립트를 변경하여 단순화 할 수는 있지만 지금 위험을 감수하고 싶지는 않습니다)
"헤더 복사"섹션은 이제 공개 헤더 위치에 대한 빌드 설정을 존중합니다 (Frederik Wallner 제공).
Doug Dickinson 덕분에 SYMROOT의 명시 적 설정 (OBJROOT도 설정해야합니까?)이 추가되었습니다.
스크립트 (이것은 복사 / 붙여 넣기를해야합니다)
사용법 / 설치 지침은 아래를 참조하십시오
##########################################
#
# c.f. /programming/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.82
#
# Latest Change:
# - MORE tweaks to get the iOS 10+ and 9- working
# - Support iOS 10+
# - Corrected typo for iOS 1-10+ (thanks @stuikomma)
#
# Purpose:
# Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode
#
# Author: Adam Martin - http://twitter.com/redglassesapps
# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)
#
set -e
set -o pipefail
#################[ Tests: helps workaround any future bugs in Xcode ]########
#
DEBUG_THIS_SCRIPT="false"
if [ $DEBUG_THIS_SCRIPT = "true" ]
then
echo "########### TESTS #############"
echo "Use the following variables when debugging this script; note that they may change on recursions"
echo "BUILD_DIR = $BUILD_DIR"
echo "BUILD_ROOT = $BUILD_ROOT"
echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"
echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"
echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"
echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"
fi
#####################[ part 1 ]##################
# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)
# (incidental: searching for substrings in sh is a nightmare! Sob)
SDK_VERSION=$(echo ${SDK_NAME} | grep -o '\d\{1,2\}\.\d\{1,2\}$')
# Next, work out if we're in SIM or DEVICE
if [ ${PLATFORM_NAME} = "iphonesimulator" ]
then
OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}
else
OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}
fi
echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})"
echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"
#
#####################[ end of part 1 ]##################
#####################[ part 2 ]##################
#
# IF this is the original invocation, invoke WHATEVER other builds are required
#
# Xcode is already building ONE target...
#
# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.
# ...we need to build ALL targets
# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)
#
#
# So: build ONLY the missing platforms/configurations.
if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse"
else
# CRITICAL:
# Prevent infinite recursion (Xcode sucks)
export ALREADYINVOKED="true"
echo "RECURSION: I am the root ... recursing all missing build targets NOW..."
echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" SYMROOT=\"${SYMROOT}\"
xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"
ACTION="build"
#Merge all platform binaries as a fat binary for each configurations.
# Calculate where the (multiple) built files are coming from:
CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos
CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator
echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}"
echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}"
# ... remove the products of previous runs of this script
# NB: this directory is ONLY created by this script - it should be safe to delete!
rm -rf "${CREATING_UNIVERSAL_DIR}"
mkdir "${CREATING_UNIVERSAL_DIR}"
#
echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"
xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"
#########
#
# Added: StackOverflow suggestion to also copy "include" files
# (untested, but should work OK)
#
echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}"
echo " (if you embed your library project in another project, you will need to add"
echo " a "User Search Headers" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)"
echo ' "$(TARGET_BUILD_DIR)/usr/local/include/"'
if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ]
then
mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
# * needs to be outside the double quotes?
cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
fi
fi
설치 지침
- 정적 lib 프로젝트 만들기
- 대상을 선택하십시오
- "빌드 설정"탭에서 "빌드 활성 아키텍처 만"을 "아니오"로 설정하십시오 ( 모든 항목에 대해)
- "빌드 단계"탭에서 "추가 ... 새 빌드 단계 ... 새 실행 스크립트 빌드 단계"를 선택하십시오.
- 위의 스크립트를 상자에 복사 / 붙여 넣기
... 보너스 옵션 사용법 :
- 선택 사항 : 라이브러리에 헤더가있는 경우 헤더 복사 단계에 추가하십시오.
- 선택 사항 : ... '프로젝트'섹션에서 '공개'섹션으로 드래그 앤 드롭
- 선택 사항 : ... 앱을 빌드 할 때마다 자동으로 "debug-universal"디렉토리의 하위 디렉토리로 내보내집니다 (usr / local / include에 있음).
- 옵션 : 참고 : 당신이 경우 에도 다른 Xcode 프로젝트에 프로젝트를 드롭 / 드래그하려고, 이것은 당신이 당신의 드래그 공공 헤더가 있다면 그것이 .IPA 파일을 만들 수 없습니다 엑스 코드 4의 버그를 노출 / 프로젝트 떨어졌다. 해결 방법 : xcode 프로젝트를 포함시키지 마십시오 (Apple 코드에 너무 많은 버그가 있습니다).
출력 파일을 찾을 수 없으면 다음과 같은 해결 방법이 있습니다.
스크립트의 맨 끝에 다음 코드를 추가하십시오 (Frederik Wallner 제공) : open "$ {CREATING_UNIVERSAL_DIR}"
Apple은 200 줄 이후의 모든 출력을 삭제합니다. 대상을 선택하고 스크립트 실행 단계에서 반드시 "빌드 로그에 환경 변수 표시"를 선택 해제해야합니다.
XCode4에 사용자 정의 "빌드 출력"디렉토리를 사용하는 경우 XCode는 모든 "예기치 않은"파일을 잘못된 위치에 둡니다.
- 프로젝트 구축
- Xcode4의 왼쪽 상단 영역에서 오른쪽의 마지막 아이콘을 클릭하십시오.
- 최상위 항목을 선택하십시오 (이것은 "가장 최근 빌드"입니다. Apple은 자동 선택해야하지만 그렇게 생각하지는 않았습니다)
- 기본 창에서 맨 아래로 스크롤하십시오. 가장 마지막 줄은 lipo : 출력 파일을 생성하는 현재 구성 (디버그)의 경우 : /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a
... 유니버설 빌드의 위치입니다.
프로젝트에 "비 소스 코드"파일을 포함시키는 방법 (PNG, PLIST, XML 등)
- 위의 모든 작업을 수행하고 작동하는지 확인하십시오.
- 첫 번째 이후에 나오는 새로운 실행 스크립트 단계를 만듭니다 (아래 코드 복사 / 붙여 넣기).
- Xbund에서 "bundle"유형의 새 Target을 만듭니다.
- MAIN PROJECT의 "빌드 단계"에서 새 번들을 "의존하는"항목으로 추가하십시오 (맨 위 섹션, 더하기 단추를 누르고 맨 아래로 스크롤, 제품에서 ".bundle"파일 찾기)
- NEW BUNDLE TARGET의 "Build Phases"에 "Copy Bundle Resources"섹션을 추가하고 모든 PNG 파일 등을 끌어다 놓으십시오.
빌드 된 번들을 FAT 정적 라이브러리와 동일한 폴더에 자동 복사하는 스크립트 :
echo "RunScript2:"
echo "Autocopying any bundles into the 'universal' output folder created by RunScript1"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
cp -r "${BUILT_PRODUCTS_DIR}/"*.bundle "${CREATING_UNIVERSAL_DIR}"