2016-12-06 20 views
1

정적 프레임 워크를 빌드하려고합니다.'lipo'실행에 실패했습니다. Lib은 같은 아키텍처를 가지고 있습니다.

그래서 나는 다음과 같은 명령을 실행 : 내가 실행하려고하면 시뮬레이터 그러나

xcodebuild 
      -project MyAppLib.xcodeproj 
      -sdk iphonesimulator 
      -target $PRODUCT_FRAMEWORK 
      -configuration Release clean build 

위한 장치

xcodebuild 
      -project MyAppLib.xcodeproj 
      -sdk iphoneos 
      -target $PRODUCT_FRAMEWORK 
      -configuration Release clean build 

에 대한

lipo :

를 구축 엑스 코드 I 성공에서

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: build/Release-iphonesimulator/MyAppLib.framework/MyAppLib and build/Release-iphoneos/MyAppLib.framework/MyAppLib have the same architectures (i386) and can't be in the same fat output file

그러나 CLI에서 모두 동일한 구조를 가지고 :

lipo -create build/Release-iphonesimulator/MyAppLib.framework/MyAppLib 
     build/Release-iphoneos/MyAppLib.framework/MyAppLib 
    -output MyAppLib.framework 

는 오류가 발생합니다.

MyAppLib.framework: Mach-O universal binary with 4 architectures: [i386: current ar archive] [arm_v7: current ar archive] [x86_64: current ar archive] [arm64] 
MyAppLib.framework (for architecture i386): current ar archive 
MyAppLib.framework (for architecture armv7): current ar archive 
MyAppLib.framework (for architecture x86_64): current ar archive 
MyAppLib.framework (for architecture arm64): current ar archive 

enter image description here


나는 단지 하나 개의 플랫폼을 실행하려고하면이 빌드가 성공한다하지만 난 심지어 그것을 탐구 할 수없는 이상한 프레임 워크를 얻을 :

$ file MyAppLib.framework

날을 제공

enter image description here

편집 :

멀티 스크립트

set -e 

# If we're already inside this script then die 
if [ -n "$RW_MULTIPLATFORM_BUILD_IN_PROGRESS" ]; then 
exit 0 
fi 
export RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1 

RW_FRAMEWORK_NAME=${PROJECT_NAME} 
RW_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a" 
RW_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework" 

function build_static_library { 
    # Will rebuild the static library as specified 
    #  build_static_library sdk 
    xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \ 
    -target "${TARGET_NAME}" \ 
    -configuration "${CONFIGURATION}" \ 
    -sdk "${1}" \ 
    ONLY_ACTIVE_ARCH=NO \ 
    BUILD_DIR="${BUILD_DIR}" \ 
    OBJROOT="${OBJROOT}" \ 
    BUILD_ROOT="${BUILD_ROOT}" \ 
    SYMROOT="${SYMROOT}" $ACTION 
} 

function make_fat_library { 
    # Will smash 2 static libs together 
    #  make_fat_library in1 in2 out 
    xcrun lipo -create "${1}" "${2}" -output "${3}" 
} 

# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name 
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]; then 
RW_SDK_PLATFORM=${BASH_REMATCH[1]} 
else 
echo "Could not find platform name from SDK_NAME: $SDK_NAME" 
exit 1 
fi 

# 2 - Extract the version from the SDK 
if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]; then 
RW_SDK_VERSION=${BASH_REMATCH[1]} 
else 
echo "Could not find sdk version from SDK_NAME: $SDK_NAME" 
exit 1 
fi 

# 3 - Determine the other platform 
if [ "$RW_SDK_PLATFORM" == "iphoneos" ]; then 
RW_OTHER_PLATFORM=iphonesimulator 
else 
RW_OTHER_PLATFORM=iphoneos 
fi 

# 4 - Find the build directory 
if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$RW_SDK_PLATFORM$ ]]; then 
RW_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}" 
else 
echo "Could not find other platform build directory." 
exit 1 
fi 

# Build the other platform. 
build_static_library "${RW_OTHER_PLATFORM}${RW_SDK_VERSION}" 

# If we're currently building for iphonesimulator, then need to rebuild 
# to ensure that we get both i386 and x86_64 
if [ "$RW_SDK_PLATFORM" == "iphonesimulator" ]; then 
build_static_library "${SDK_NAME}" 
fi 

# Join the 2 static libs into 1 and push into the .framework 
make_fat_library "${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \ 
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \ 
"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}" 

# Ensure that the framework is present in both platform's build directories 
cp -a "${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}" \ 
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}" 

# Copy the framework to the user's desktop 
ditto "${RW_FRAMEWORK_LOCATION}" "${HOME}/Desktop/${RW_FRAMEWORK_NAME}.framework" 
+0

Xcode가 표시된 설정으로 모든 아키텍처를 분해합니다. 빌드 단계 스크립트를 실행하고있는 것 같습니다. 그렇지 않다면 : 올바른 아키텍처에'i386, x86_64'를 추가하고'Release'에'Build Active Architecture Only'를'NO'로 설정하십시오. 또한 :'file' 출력물은 무엇입니까? Xcode 빌드 또는 CLI 빌드? 또한 "이상한 프레임 워크"의 문제점은 무엇입니까? – shallowThought

+0

@shallowThought 나는 Debug and Release 모두에 대해'Build Active Architecture Only'를'YES'했습니다. 멀티 플랫폼 스크립트도 게시했습니다. iOS와 시뮬레이터 모두에 정적 프레임 워크를 빌드해야합니까? '이상한 프레임 워크 '에서'MyAppLib.framework'는 폴더가 아니라 파일이라는 것을 의미합니다. – snaggs

+0

앱에서이 라이브러리를 사용하려면 장치에서이 라이브러리를 사용하고 시뮬레이터에서 앱을 디버그 할 수 있어야합니다. 그래서 네, 당신은 장치 및 시뮬레이터를 구축하고 싶습니다. – shallowThought

답변

1

솔루션 :

당신은 문제가 없습니다. 프로젝트를 빌드 한 후에 나타나는 MyAppLib.framework은 모든 필수 아키텍처의 조각이 포함 된 정적 라이브러리입니다.

프로젝트를 빌드 한 후 lipo을 사용할 필요가 없습니다.

문제 :

빌드 스크립트는 "자동으로"한 번 장치를 한 번 시뮬레이터를 들어, 두 번 대상을 구축합니다. 그런 다음 lipo을 사용하여 두 빌드 아티팩트를 하나의 fat 라이브러리 (make_fat_library)에 병합합니다.

이후에 복사합니다 결과 주위에 : 모두 디렉토리를 구축 한 결과

#Ensure that the framework is present in both platform's build directories

, 당신은 지방 LIB 프레임 워크를 가지고있다.

이제 두 개의 (이미 병합 된) fat 라이브러리를 병합하려고합니다. 둘 다 동일한 슬라이스를 포함하므로 오류가 발생합니다.