我正在尝试在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)。我在排除的架构中没有任何设置。

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


当前回答

当我遇到这个问题时,我正试图构建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}

其他回答

排除arm64后,我总是得到ARCHS[@]:未绑定变量。对我来说,唯一的解决方案是将x86_64添加到此处提到的目标构建设置中。升级到Xcode 12:ld:building For iOS Simulator后出现问题,但链接到dylib build For iOS,架构arm64。您也可以删除之前添加的exclude arm64。

基本上,您必须从项目和Pod项目中排除模拟器架构的arm64。

要做到这一点,请导航到项目的Build Settings,并在Excluded Architecture中添加值为arm64的任何iOS模拟器SDK。

OR

如果您使用的是自定义XCConfig文件,您可以简单地添加此行以排除模拟器架构。EXCLUDED_ARCHS[sdk=iphone模拟器*]=臂64然后您必须对Pod项目进行同样的操作,直到所有Cocoa Pod供应商都完成了在其Podspec中添加以下内容。s.pod_target_xcconfig={'EXCLUDED_ARCHS[sdk=iphonesimulator*]'=>'arm64'}s.user_target_xcconfig={'EXCLUDED_ARCHS[sdk=iphonesimulator*]'=>'arm64'}您可以手动将排除的体系结构添加到Pod项目的构建设置中,但当您使用pod安装。取而代之的是,您可以在Podfile中添加此片段。每次运行pod安装时,它都会写入必要的构建设置。安装后执行|安装程序|安装程序.pods_project.build_configurations.each do | config|config.build_settings[“EXCLUDED_ARCHS[sdk=iphonesimulator*]”]=“arm64”终止终止

在尝试并搜索了不同的解决方案后,我认为最安全的方法是在Podfile末尾添加以下代码

post_install do |pi|
   pi.pods_project.targets.each do |t|
       t.build_configurations.each do |bc|
          bc.build_settings['ARCHS[sdk=iphonesimulator*]'] =  `uname -m`
       end
   end
end

这样,您只能将iOS模拟器的编译器架构覆盖为当前的cpu架构。与其他解决方案相比,该解决方案也适用于使用Apple Silicon的计算机。

在我的案例中:Xcode 12

我在EXCLUDED_ARCHS上设置了空值,并设置了ONLY_ACTIVE_ARCH Debug=YES Release=NO Project的Build Setting

我在我的播客文件中包括了这一点:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
        end
    end
end

它在我的模拟器iPhone 8(iOS 12)和iPhone 11 Pro Max(iOS 14)以及我的设备iPhone 7 Plus(iOS 13.4)上运行。

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

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

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

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

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

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

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