在 fat 文件上构建 iOS 框架时缺少架构 armv7s 和 x86_64。

5

我正在按照以下网站的指南自己构建框架:

为iOS创建框架 - RayWenderlich

它运作良好,但是当我将框架集成到测试项目中时,会出现“undefined symbol for architecture arm64”的错误。当我使用以下命令检查受支持的体系结构时,

<myframework>.framework xcrun lipo -info <myframework>

它缺少两个架构:armv7s和x86_64

这是我的聚合目标运行脚本

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"

我猜集成框架到测试项目时出现的构建错误是由于构建框架时缺少架构所致。

有关此事有任何消息吗?我只缺少armv7s。 - Sanandrea
@Sanandrea,我在架构中添加了2个架构armv7和armv7s,在有效架构中,我添加了所有架构,包括armv7、armv7s、arm64、i386和x86_64。这解决了我的问题。 - Scofield Tran
1
我遇到了一个类似的问题,但出现在最终的fat文件中,只想生成i386和x86_64两种架构。 - user562566
2个回答

7
在我的情况下已经解决了:在主目标(如果您参考Ray W.的帖子,则为RWUIControls)中,我手动添加了armv7s架构。请见下方截图。如果我从终端运行以下命令:
xcrun lipo -info RWUIControls 

现在在框架文件夹中,我得到:

Architectures in the fat file: RWUIControls are: armv7 armv7s i386 x86_64 arm64

0

只需要在项目信息中更改 iOS 开发目标即可轻松完成。

在我的情况下,我先选择了 iOS 13,然后将其更改为 iOS 10,现在我有了这些架构 -> armv7 i386 x86_64 arm64。

这些是根据 iOS 设备而定的体系结构。

armv64:iPhoneX,iPhone 5s-8,iPad Air - iPad Pro armv7:iPhone3Gs-5c,iPad WIFI(第4代) armv6:iPhone - iPhone3G 以上适用于真实设备 i386:32位模拟器 x86_64:64位模拟器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接