我正在尝试在Xcode 12(beta 5)中构建一个大型(正在开发Xcode 11!)项目,为iOS 14做准备。代码库以前是Objective-C中的,但现在它同时包含Objective-C和Swift,并使用Objective-C或Swift的pod。

我已经推出了支持Xcode 12的CocoaPods新测试版(目前为1.10.0.beta 2)。

Pod安装成功。当我进行构建时,在pod框架上出现以下错误:

为iOS模拟器构建,但链接到为iOS构建的对象文件中,用于体系结构arm64

以及可能的错误:

无法加载目标“arm64-apple-ios11.0”的标准库

当我在框架上运行lipo-info时,它有:armv7s armv7 i386 x86_64 arm64。

此前,该项目的有效架构设置为:armv7、armv7s和arm64。

在Xcode 12中,根据苹果的文档,该设置将消失。架构设置为$(ARCH_STANDARD)。我在排除的架构中没有任何设置。

这里可能发生了什么?我还没能用一个更简单的项目重现这一点。


当前回答

为模拟器编译时出现问题:

为iOS模拟器构建,但链接到为iOS构建的对象文件中,用于体系结构arm64

Xcode 12.1, Pod 1.9.1

我的项目结构

主要目标共享扩展名通知服务扩展子模块,自定义框架播客文件

将arm64添加到构建设置->排除所有目标中的体系结构。从VALID_ARCHS中删除arm64,并在所有目标中添加x86_64。在podfile中添加以下代码安装后执行|安装程序|安装程序.pods_project.build_configurations.each do | config|config.build_settings[“EXCLUDED_ARCHS[sdk=iphonesimulator*]”]=“arm64”终止终止更新了pod,删除了podfile.lock,并安装了pod做一个干净的构建。

其他回答

我找到了解决方案!SwiftUI预览无法使用Firebase

如果您将模拟器的排除架构设置为arm64,它将编译。

X代码12

从“用户定义”组下的“生成”设置中删除VALID_ARCH对我有效。

当我遇到这个问题时,我正试图构建xcFramework。没有什么帮助,但我设法用lipo解决了这个问题,并分享了我的脚本:

OUTPUT_DIR_PATH="${PROJECT_DIR}/XCFramework"

function archivePathSimulator {
    local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-SIMULATOR"
    echo "${DIR}"
}

function archivePathDevice {
    local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-DEVICE"
    echo "${DIR}"
}

function archive {
    echo "▸ Starts archiving the scheme: ${1} for destination: ${2};\n▸ Archive path: ${3}.xcarchive"
    xcodebuild clean archive \
    -project "${PROJECT_NAME}.xcodeproj" \
    -scheme ${1} \
    -configuration ${CONFIGURATION} \
    -destination "${2}" \
    -archivePath "${3}" \
    SKIP_INSTALL=NO \
    OBJROOT="${OBJROOT}/DependentBuilds" \
    BUILD_LIBRARY_FOR_DISTRIBUTION=YES | xcpretty
}

# Builds archive for iOS simulator & device
function buildArchive {
    SCHEME=${1}

    archive $SCHEME "generic/platform=iOS Simulator" $(archivePathSimulator $SCHEME)
    archive $SCHEME "generic/platform=iOS" $(archivePathDevice $SCHEME)
}

# Creates xc framework
function createXCFramework {
    FRAMEWORK_ARCHIVE_PATH_POSTFIX=".xcarchive/Products/Library/Frameworks"
    FRAMEWORK_SIMULATOR_DIR="$(archivePathSimulator $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"
    FRAMEWORK_DEVICE_DIR="$(archivePathDevice $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"

    echo "Removing ${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}"

    if lipo "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}" -verify_arch "arm64"; then
        echo "Removing arm64"
        lipo -remove "arm64" -output "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}" "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}"
    fi

    xcodebuild -create-xcframework \
               -framework ${FRAMEWORK_SIMULATOR_DIR}/${1}.framework \
               -framework ${FRAMEWORK_DEVICE_DIR}/${1}.framework \
               -output ${OUTPUT_DIR_PATH}/xcframeworks/${1}.xcframework
}

echo "#####################"
echo "▸ Cleaning the dir: ${OUTPUT_DIR_PATH}"
rm -rf $OUTPUT_DIR_PATH

DYNAMIC_FRAMEWORK="${PROJECT_NAME}"

echo "▸ Archive $DYNAMIC_FRAMEWORK"
buildArchive ${DYNAMIC_FRAMEWORK}

echo "▸ Create $DYNAMIC_FRAMEWORK.xcframework"
createXCFramework ${DYNAMIC_FRAMEWORK}

在尝试了这个问题的几乎所有答案并阅读了苹果开发者论坛后,我发现只有一个解决方案适合我。

我正在构建一个通用框架,该框架在Swift应用程序中使用。我无法在没有架构错误的情况下构建模拟器。

在我的框架项目中,我在构建阶段有一个通用框架任务。如果你是这样的话:

在构建阶段将以下内容添加到xcodebuild任务中:EXCLUDED_ARCHS=“arm64”

接下来,您必须更改以下项目生成设置:

删除VALID_ARCHS用户定义的设置将ONLY_ACTIVE_ARCH设置为YES***

***如果您正在开发一个框架,并且有一个演示应用程序,则必须在两个项目中都启用此设置。

我不需要建造模拟器。

对我来说,原因是我在顶部栏的iOS模拟器下选择了一个iPad,在那里你可以选择构建目标-选择一个真实的设备或任何iOS设备(arm64,armv7)解决了这个问题。