2016-12-06 5 views
1

Я пытаюсь создать статическую структуру.Не удалось запустить «lipo», у Lib есть те же архитектуры

Так я бегу следующие команды:

для устройства

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 

Я получаю сообщение об ошибке:

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

От Xcode I успеха, чтобы построить его, но из 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 

enter image description here


Если я пытаюсь запустить только для одной платформы, то сборка удалось, но я получаю странные рамки, которые я не могу даже изучить его:

enter image description here

Edit:

Multiplatform сценарий:

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 выплескивает все архитектуры с показанными настройками. Я подозреваю, что вы запускаете сценарий Build Phase. Если нет: Добавьте 'i386, x86_64' в свои допустимые архитектуры и установите' Build Active Architecture Only' '' '' '' '' '' '' '' ''. Также: что такое 'file'output. Строка Xcode или сборка CLI? Кроме того, что не так с «странным каркасом»? – shallowThought

+0

@shallowThought У меня есть 'Build Active Architecture Only' 'YES' для Debug и Release. Я также написал «Мультиплатформенный скрипт». Мне нужно запустить статическую структуру как для iOS, так и для симулятора? Под 'странным каркасом' я подразумеваю, что' MyAppLib.framework' является файлом, а не папкой. – snaggs

+0

Если вы хотите использовать эту библиотеку в приложении, вы хотите использовать ее на устройстве, а также отлаживать свое приложение в симуляторе. Так что да, вы хотите построить для устройства и симулятора. – shallowThought

ответ

1

Решение:

У вас нет проблемы. MyAppLib.framework, который появляется после создания вашего проекта является вашей статической библиотекой, содержащей срезы для всех требуемых архитектур.

Не нужно использовать lipo после создания вашего проекта.

Выпуск:

Ваш сценарий сборки «автоматически» строит свою цель дважды, один раз для устройств и один раз для тренажеров. Впоследствии он объединяет оба сборника артефактов с одним жирным lib (make_fat_library), используя lipo.

Затем он копирует результат вокруг:

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

В результате, у вас есть жирную Lib рамки в обоих директории сборки.

Теперь вы пытаетесь объединить эти две (уже слитые) живые библиотеки. Поскольку оба содержат одни и те же фрагменты, вы получаете ошибку.