【问题标题】:iOS framework missing required architecture arm64iOS 框架缺少所需的架构 arm64
【发布时间】:2016-09-11 23:18:39
【问题描述】:

我正在尝试在 iOS 中创建和使用框架。它以前可以工作,并且可以在模拟器上工作,但不能在较新的 iPhone 6 上工作。

我怀疑它与脚本有关,但据我所见(我大部分是为互联网复制脚本)它确实包含 arm64:

set -e
set +u
# Avoid recursively calling this script.
if [[ $SF_MASTER_SCRIPT_RUNNING ]]
then
exit 0
fi
set -u
export SF_MASTER_SCRIPT_RUNNING=1


# Constants
SF_TARGET_NAME=${PROJECT_NAME}
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Take build target
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]
then
SF_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi

if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
echo "Please choose iPhone simulator as the build target."
exit 1
fi

IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos

# Build the other (non-simulator) platform
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION

xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}"  CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION

# Copy the framework structure to the universal folder (clean it first)
rm -rf "${UNIVERSAL_OUTPUTFOLDER}"
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework"

# Smash them together to combine all architectures
lipo -create  "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"

知道我需要做什么来编译 arm64 以便它可以在 iPhone 6+ 上运行吗?

我似乎收到了这个错误:

Please choose iPhone simulator as the build target. Command /bin/sh failed with exit code 1

这听起来与未运行的脚本有关。由于我的测试项目中没有任何脚本,所以我回到我的框架并尝试将其设置为 Run script only when installing 并重新构建我的框架,但这似乎仍然无法正常工作。

【问题讨论】:

    标签: ios iphone frameworks


    【解决方案1】:

    你不能,除非你有框架的源代码,并且可以重新编译它。 (无论如何,那是您最好的解决方案。)实际上您现在正在运行 64 位代码,并且您的框架仅针对 32 位代码进行编译。我确实编写了一个 hack,允许您使用以前版本的 arm 库,但我认为 hack 不会在跳转到更大的位大小后幸存下来。喜欢的可以试试:click for hack.

    【讨论】:

    • 这是我的框架,所以我有源代码。在我的原始消息中,我发布了脚本 - 是否需要在其中进行任何更改以便编译为 64 位代码? (我想我是从互联网上抓取的,它说它应该为 arm64 编译)
    • 在您的构建设置中,在架构下,确保它是 $(ARCHS_STANDARD) 或类似的东西。 (我说:标准架构(armv7,arm64)-$(ARCHS_STANDARD)。重建您的框架,替换项目中使用该框架的 .a 文件。
    • 如果您在构建设置中设置它,那么您可能完全可以将其排除在脚本之外。它看起来像是为 arm64 构建的,并用 armv7 覆盖它
    • 我需要脚本的任何部分还是应该完全删除它?
    • 我会尝试直接从 IDE 构建它,看看是否可以从那里获得可接受的 .a 文件。你可以用 lipo 检查它是否有正确的切片。
    【解决方案2】:

    当您不为 iOS 模拟器构建时,您的脚本会生成该错误消息并退出(不生成任何库)。这是有问题的代码:

    # Take build target
    if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]
    then
    SF_SDK_PLATFORM=${BASH_REMATCH[1]}
    else
    echo "Could not find platform name from SDK_NAME: $SDK_NAME"
    exit 1
    fi
    
    if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
    then
    echo "Please choose iPhone simulator as the build target."
    exit 1
    fi
    

    【讨论】:

      【解决方案3】:

      检查您的架构和有效架构,并将 $(inherited) 添加到其他链接器标志。

      【讨论】:

      • 抱歉我在这里是个菜鸟,但我对 iOS 不太熟悉 :)。检查架构的最佳方法是什么/我将如何去做?
      • 选择你的项目 -> 目标 -> 构建设置
      • 这似乎对我不起作用。我似乎收到了Please choose iPhone simulator as the build target. Command /bin/sh failed with exit code 1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2015-04-23
      • 2012-04-03
      • 2016-02-03
      相关资源
      最近更新 更多