Xcode 및 SDK 4+를 사용하여 뚱뚱한 정적 라이브러리 (장치 + 시뮬레이터) 구축


283

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

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

Xcode 내에서 수행 할 수있는 간단하고 휴대 가능하며 재사용 가능한 기술을 찾고 있습니다.

일부 역사 :

  • 2008 년에는 sim과 장치가 모두 포함 된 단일 정적 라이브러리를 만들 수있었습니다. 애플은 그것을 비활성화했다.
  • 2009 년 동안 우리는 정적 라이브러리 쌍을 만들었습니다. 하나는 sim 용이고 다른 하나는 장치 용입니다. 애플도 이제이를 비활성화했다.

참고 문헌 :

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

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

    • Apple의 최신 변경 사항 때문에 Simulator 부분은 arm6 / arm7의 차이점과 더 이상 동일하지 않습니다. 다른 문제입니다. 위의 내용 참조)

궁금해-왜 그걸 원해? 장치 라이브러리가 장치에서 더 크고 무겁지 않습니까?
cregox

3
@Cawas-라이브러리의 "무게"는 실제 상황의 95 %와 관련이 없습니다. 대부분의 경우 lib는 크기가 작습니다. 예를 들어 단일 UIImageView 하나만 표시하는 것과 비교할 때 특히 그렇습니다.
Adam

1
@Cawas-한편, 여기서 가치는 다른 사람들이 라이브러리를 더 쉽게 사용 / 재사용 할 수있게한다는 것입니다. 1 단계 드래그 앤 드롭 프로세스가됩니다.
Adam

4
@Cawas-마지막으로, 놀랍게도 귀중한 이점 : 실수로 누군가에게 "잘못된"컴파일 된 라이브러리를 보내는 것은 매우 쉽습니다. XCode는 제로 검사를 수행하지 않으며, "잘못된"아키텍처를 "정확한"것으로 간주되는 명명 된 파일로 행복하게 컴파일합니다. 건축물. Apple 은이 영역에서 Xcode계속 깨뜨 립니다. 새로운 버전마다 "어제 lib를 올바르게 컴파일하기 위해 누른 버튼이 오늘 잘못 컴파일됩니다"라는 의미의 변경 사항이 있습니다. 애플이 우리를 뒤죽박죽으로 만들 때까지, 우리는 그들의 나쁜 UI를 바보 증명해야합니다 :).
Adam

1
정말 좋을 것입니다! 지금처럼, 우리는 조금 더 복잡한 것에 시뮬레이터를 사용할 수 없습니다.
cregox

답변:


272

대안 :

최신 버전의 간편한 복사 / 붙여 넣기 (설치 지침이 변경 될 수 있음-아래 참조)

Karl의 라이브러리 는 설정하는 데 훨씬 더 많은 노력이 필요하지만 훨씬 더 좋은 장기 솔루션입니다 (라이브러리를 Framework로 변환합니다).

이것을 사용하고 그것을 조정하여 아카이브 빌드에 대한 지원을 추가하십시오 -cf @Frederik의 아카이브 모드에서 잘 작동하기 위해 그가 사용하는 변경 사항에 대한 아래의 주석.


최근 변경 사항 : 1. iOS 10.x 지원 추가 (이전 플랫폼 지원 유지)

  1. 이 스크립트를 다른 프로젝트와 함께 프로젝트에 포함시키는 방법에 대한 정보 (내가 그렇게하지 않는 것이 좋습니다)-Xcode에서 프로젝트를 서로 삽입하면 Apple은 Xcode에 몇 가지 쇼 스토퍼 버그가 있습니다. 3.x에서 Xcode 4.6.x까지)

  2. 번들을 자동으로 포함 할 수있는 보너스 스크립트 (예 : 라이브러리에서 PNG 파일, PLIST 파일 등 포함)-아래 참조 (아래로 스크롤)

  3. 이제 iPhone5 (리포의 버그에 대한 Apple의 해결 방법 사용)를 지원합니다. 참고 : 설치 지침이 변경되었습니다 (나중에 스크립트를 변경하여 단순화 할 수는 있지만 지금 위험을 감수하고 싶지는 않습니다)

  4. "헤더 복사"섹션은 이제 공개 헤더 위치에 대한 빌드 설정을 존중합니다 (Frederik Wallner 제공).

  5. 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

설치 지침

  1. 정적 lib 프로젝트 만들기
  2. 대상을 선택하십시오
  3. "빌드 설정"탭에서 "빌드 활성 아키텍처 만"을 "아니오"로 설정하십시오 ( 모든 항목에 대해)
  4. "빌드 단계"탭에서 "추가 ... 새 빌드 단계 ... 새 실행 스크립트 빌드 단계"를 선택하십시오.
  5. 위의 스크립트를 상자에 복사 / 붙여 넣기

... 보너스 옵션 사용법 :

  1. 선택 사항 : 라이브러리에 헤더가있는 경우 헤더 복사 단계에 추가하십시오.
  2. 선택 사항 : ... '프로젝트'섹션에서 '공개'섹션으로 드래그 앤 드롭
  3. 선택 사항 : ... 앱을 빌드 할 때마다 자동으로 "debug-universal"디렉토리의 하위 디렉토리로 내보내집니다 (usr / local / include에 있음).
  4. 옵션 : 참고 : 당신이 경우 에도 다른 Xcode 프로젝트에 프로젝트를 드롭 / 드래그하려고, 이것은 당신이 당신의 드래그 공공 헤더가 있다면 그것이 .IPA 파일을 만들 수 없습니다 엑스 코드 4의 버그를 노출 / 프로젝트 떨어졌다. 해결 방법 : xcode 프로젝트를 포함시키지 마십시오 (Apple 코드에 너무 많은 버그가 있습니다).

출력 파일을 찾을 수 없으면 다음과 같은 해결 방법이 있습니다.

  1. 스크립트의 맨 끝에 다음 코드를 추가하십시오 (Frederik Wallner 제공) : open "$ {CREATING_UNIVERSAL_DIR}"

  2. Apple은 200 줄 이후의 모든 출력을 삭제합니다. 대상을 선택하고 스크립트 실행 단계에서 반드시 "빌드 로그에 환경 변수 표시"를 선택 해제해야합니다.

  3. XCode4에 사용자 정의 "빌드 출력"디렉토리를 사용하는 경우 XCode는 모든 "예기치 않은"파일을 잘못된 위치에 둡니다.

    1. 프로젝트 구축
    2. Xcode4의 왼쪽 상단 영역에서 오른쪽의 마지막 아이콘을 클릭하십시오.
    3. 최상위 항목을 선택하십시오 (이것은 "가장 최근 빌드"입니다. Apple은 자동 선택해야하지만 그렇게 생각하지는 않았습니다)
    4. 기본 창에서 맨 아래로 스크롤하십시오. 가장 마지막 줄은 lipo : 출력 파일을 생성하는 현재 구성 (디버그)의 경우 : /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

    ... 유니버설 빌드의 위치입니다.


프로젝트에 "비 소스 코드"파일을 포함시키는 방법 (PNG, PLIST, XML 등)

  1. 위의 모든 작업을 수행하고 작동하는지 확인하십시오.
  2. 첫 번째 이후에 나오는 새로운 실행 스크립트 단계를 만듭니다 (아래 코드 복사 / 붙여 넣기).
  3. Xbund에서 "bundle"유형의 새 Target을 만듭니다.
  4. MAIN PROJECT의 "빌드 단계"에서 새 번들을 "의존하는"항목으로 추가하십시오 (맨 위 섹션, 더하기 단추를 누르고 맨 아래로 스크롤, 제품에서 ".bundle"파일 찾기)
  5. 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}"

2
나는 이것을 몇 가지 프로젝트에서 사용했으며 라이브러리를 빌드하는 데 사용하는 앱 스토어에 물건을 배송했습니다. 모두 100 % 정상적으로 작동 했으므로 지금은이 문제를 고수하고 있습니다 (아마 Xcode 4까지)
Adam

2
이 방법이 XCode 4.5에서 작동하는지 확인할 수 있습니까? 정적 라이브러리를 컴파일하고 기본 프로젝트에서 사용하려고합니다. 장치에서는 실행할 수 있지만 시뮬레이터에서는 실행할 수 없습니다. 이것은 내가 얻는 오류입니다 : 파일 /Users/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a에서 필요한 아키텍처 i386 누락 (2 조각)
Alex1987

2
XCode 5 및 ARM64 에서이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 아키텍처를 표준으로두면 armv7, armvs7 및 i386을 사용하여 라이브러리를 예상대로 만듭니다. 64 비트를 포함하여 아키텍처를 표준으로 설정하면 라이브러리에는 "cputype 16777223"만 포함됩니다. .a 파일에서 otool -h를 사용하여 내부 내용 확인
Roger Binns

1
XCode5는 실행 스크립트 빌드 단계를 더욱 까다롭게 만들었습니다. 이것을 확인하십시오 : runscriptbuildphase.com
Fabio Napodano

1
이것은 변경 사항없이 Xcode 6에서 제대로 작동하는 것으로 보입니다 (지금까지 몇 가지 프로젝트를 시도했지만 아직 App Store 업데이트를 제출하지 않았지만 지금까지는 모두 정상적으로 작동합니다).
Adam

85

armv7, armv7s 및 시뮬레이터에서 작동하는 뚱뚱한 정적 라이브러리를 작성하는 데 많은 시간을 보냈습니다. 마침내 해결책을 찾았습니다 .

요점은 두 개의 라이브러리 (장치 용과 시뮬레이터 용으로 하나씩)를 개별적으로 구축하고 서로 구별하기 위해 이름을 바꾼 다음 lipo를 만들어 하나의 라이브러리로 만드는 것입니다.

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

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


4
수락 된 답변을 읽으십시오. 2 년 전에 이미 다루어 졌음을 알 수 있습니다.
Adam

2
나는 그것을 읽고, 스크립트를 사용했지만 armv7s에는 효과가 없었습니다.
g_low

2
lipo 명령은 스크립트에서 작동하지 않지만 수동으로 훌륭하게 작동합니다! 10x
Dima

9
+1 이것은 "필요한 프레임 워크"스크립트가 아니라 실제로 필요한 전부였습니다.
LearnCocos2D 2016 년

귀하의 SolutionURL이 "오류 404-찾을 수 없음"을 반환 함
Alex

74

일반 라이브러리를 만드는 것처럼 쉽게 범용 프레임 워크를 만들 수 있는 XCode 4 프로젝트 템플릿 을 만들었습니다.


iOS 4.3 대상으로 빌드 할 수 없습니다. 다음 오류가 발생합니다. -stdlib = libc ++에 대한 잘못된 배포 대상 (iOS 5.0 이상 필요)
Alex1987

CMake를 사용하여 정적 라이브러리를 만드는 것보다 훨씬 쉽게이 답변에 더 많은 평판을 줄 수 있기를 바랍니다. 이렇게 해주셔서 감사합니다!
iwasrobbed

그것은 나를 위해 iOS 6에서도 작동합니다. 그러나 아마도 내 라이브러리는 매우 단순하고 종속성과 리소스가 없기 때문일 수 있습니다.
Paulius Vindzigelskis

이 솔루션에는 큰 문제가 있습니다.이 솔루션으로 작성된 프레임 워크를 사용하려는 다른 사람 (이 솔루션은 fremework 템플릿을 xcode에 설치하도록 제안합니다)이 템플릿을 THEIR xcode에 설치해야합니다!
evya

실제 프레임 워크 용 템플릿 만 설치하면됩니다. 가짜 프레임 워크는 수정되지 않은 Xcode에서 잘 실행됩니다.
Karl

30

명령 행 유틸리티가 xcodebuild있으며 xcode 내에서 쉘 명령을 실행할 수 있습니다. 따라서 사용자 정의 스크립트를 사용하는 것이 마음에 들지 않으면이 스크립트가 도움이 될 수 있습니다.

#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 기반 배치 빌드 기능을 제공하지 않을 것으로 예상됩니다.


고마워, 기본 간단한 명령이 여전히 작동하는 것으로 나타났습니다. 애플이 GUI를 크게 깨뜨린 것입니다. 모든 대상을 미리 만들고 xcode 빌드 변수를 사용하여이 스크립트를 연결하여 Apple이 깨뜨린 것을 "고르지 않고"수정하는 완전한 사용자 정의 프로젝트 템플릿을 만들 수있는 것 같습니다. 나는 다음 프로젝트에서 시도해 볼 것이다 :)
Adam

1
나는 이와 비슷한 스크립트를 사용하여 쉘 스크립트 만 포함하는 새로운 대상 아래에 두었습니다. 위의 재귀 빌드 스크립트는 매우 영리하지만 불필요하게 혼동됩니다.
benzado

1
나는 이런 것들을 위해 쉘 스크립트를 선호한다. 여기에 내 취향 gist.github.com/3178578
slf

@benzado 그래 쉘 스크립트를 쉽게 읽을 수 있어야하기 때문에 의도적으로 복잡성을 피했다.
Eonil

lipo : 입력 파일을 열 수 없습니다 : / Debug-iphoneos /
Dima

11

JsonKit에 대한 정적 정적 라이브러리가 필요했기 때문에 Xcode에서 정적 lib 프로젝트를 만든 다음 프로젝트 디렉토리 에서이 bash 스크립트를 실행했습니다. "빌드 활성 구성 만"을 끈 상태에서 xcode 프로젝트를 구성한 경우 모든 아키텍처를 하나의 lib로 가져와야합니다.

#!/bin/bash
xcodebuild -sdk iphoneos
xcodebuild -sdk iphonesimulator
lipo -create -output libJsonKit.a build/Release-iphoneos/libJsonKit.a build/Release-iphonesimulator/libJsonKit.a

7

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\}$')

감사. 오늘 아침에도 비슷한 변경을했지만 \ d를 사용했습니다. 이것이 내가 생각하는 것 (당신의 것보다 나쁘거나 나쁘지 않은가?) ... grep -o '\ d \ {1,2 \} \. \ d \ {2 \} $'
Adam

나는 숫자 만 고려하기 때문에 나의 것이 더 안정적이라고 생각합니다
ben

1
아니요, 귀하의 숫자를 쓰는 1 가지 특정 방식과 일치합니다. 애플이 역사적으로 문자화 된 문자와 텍스트 (예를 들어 파일 이름)를 지원 (및 사용)하면 소수의 자릿수 선택이 덜 신뢰할 것으로 기대합니다.
Adam

1
알 겠어. 적어도 내 프로젝트도 제대로 작동했고 다음 89 iOS 버전에서도 안전합니다.
ben

@ben 솔루션은 나를 위해 작동합니다. Adam의 정규 표현식 '[\\. 0-9] \ {3,4 \} $'는 오류 코드 2를 제공합니다.
Zee

4

나는 이것을 Karl의 정적 프레임 워크 템플릿과 같은 맥락에서 Xcode 4 템플릿 으로 만들었습니다 .

링커 버그로 인해 정적 프레임 워크 (일반 정적 라이브러리 대신)가 LLVM에서 임의 충돌을 일으키는 것으로 나타났습니다. 따라서 정적 라이브러리가 여전히 유용하다고 생각합니다!


안녕하세요 마이클, 정적 라이브러리 템플릿을 사용해 보았지만 시뮬레이터는 컴파일 할 수 있지만 장치는 컴파일 할 수 없습니다. ** 빌드 실패 ** 다음 빌드 명령이 실패했습니다. ProcessPCH / var / folders / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth MenuBarUniversal / MenuBarUniversal-Prefix.pch 일반 armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler1 실패. ) 처음 200 개의 알림 만 표시 종료 코드 65
Kappe으로

2

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

하나의 메모 항목. 공개로 표시 한 포함 파일을 복사하지 않는 것으로 나타났습니다. 나는 당신의 스크립트에 내가 가지고있는 것을 당신에게 맞게 조정했으며 상당히 잘 작동합니다. 스크립트 끝에 다음을 붙여 넣습니다.

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

1
좋아, 위의 답변에 추가했습니다. (아직 테스트 할 기회는 없었지만 나에게는 맞습니다)
Adam

1

나는 실제로 내 자신의 스크립트를 작성 목적을 위해 를 했습니다. Xcode를 사용하지 않습니다. (이것은 Gambit Scheme 프로젝트에서 유사한 스크립트를 기반으로합니다.)

기본적으로 ./configure를 실행하고 세 번 (i386, armv7 및 armv7s) 만들고 각 결과 라이브러리를 팻 라이브러리로 결합합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.