1

静的フレームワークを構築しようとしています。

したがって、次のコマンドを実行します。

デバイス用

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

シミュレータ用

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

ただし、実行しようとするとlipo:

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

エラーが発生します:

致命的なエラー: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: build/Release-iphonesimulator/MyAppLib.framework/MyAppLib および build/Release-iphoneos/MyAppLib.framework/MyAppLib がある同じアーキテクチャ (i386) であり、同じファット出力ファイルにすることはできません

Xcodeからはビルドに成功しましたが、CLIからは両方とも同じ構造です。

$ file 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

ここに画像の説明を入力


1 つのプラットフォームでのみ実行しようとすると、ビルドは成功しますが、調べることさえできない奇妙なフレームワークが発生します。

ここに画像の説明を入力

編集:

マルチプラットフォーム スクリプト:

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"
4

1 に答える 1

1

解決:

問題はありません。プロジェクトのMyAppLib.frameworkビルド後に表示されるの、必要なすべてのアーキテクチャのスライスを含む静的ライブラリです。

lipoプロジェクトのビルド後に使用する必要はありません。

問題:

ビルド スクリプトは、デバイス用とシミュレーター用の 2 回、ターゲットを "自動的に" ビルドします。その後、 を使用して、両方のビルド アーティファクトを 1 つのファット lib( make_fat_library)にマージしlipoます。

その後、結果を次の場所にコピーします。

# フレームワークが両方のプラットフォームのビルド ディレクトリに存在することを確認します

その結果、両方のビルド ディレクトリにファット ライブラリ フレームワークが作成されます。

ここで、これら 2 つの (既にマージされている) ファット ライブラリをマージしようとしています。両方に同じスライスが含まれているため、エラーが発生します。

于 2016-12-07T11:14:41.937 に答える