试图在Xcode 12(测试版5)中建立大型项目(并在Xcode 11上工作),以便为iOS 14做好准备。代码库以前是Obj-C,但现在同时包含Obj-C和Swift,并使用同样是Obj-C和/或Swift的广告连播。
我已经在Xcode 12支持下发布了新的cocoapods beta(目前是1.10.0.beta 2)。
荚安装成功。当我进行构建时,在pod框架上出现以下错误:
“正在为iOS Simulator构建,但是在为iOS而构建的目标文件中进行链接,以用于arm64体系”
当我在框架上运行lipo -info时,它具有:armv7s armv7 i386 x86_64 arm64。
以前,该项目的有效架构设置为:armv7,armv7s和arm64。
根据Apple的文档,在Xcode 12中,该设置消失了。体系结构设置为$(ARCHS_STANDARD)。在排除的体系结构中我什么都没有设置。
任何人都知道这里可能会发生什么?我还不能用一个更简单的项目来重现这一点。
答案 0 :(得分:429)
基本上,您必须从项目和Pod项目中排除arm64
的模拟器体系结构,
OR
Excluded Architecture
文件,则只需添加此行即可排除模拟器体系结构。XCConfig
然后
您必须对 Pod项目执行相同的操作,直到所有可可豆荚供应商都在其 Podspec 中添加了以下内容。
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
您可以在Pod项目的构建设置中手动添加s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
,但是当您使用Excluded Architechure
时,它将被覆盖。
为此,您可以在pod install
中添加此代码段。每次您运行Podfile
pod install
答案 1 :(得分:103)
TL; DR;
为您的库/应用程序(即使对于发布模式),将“仅构建Active Architecture(ONLY_ACTIVE_ARCH
)”设置为是。
在尝试找出问题的根本原因时,我意识到了一些有关Xcode 12的有趣事实。
Xcode 12实际上是Apple Silicon的垫脚石,不幸的是尚无此产品。但是有了该平台,我们将获得基于arm64的macOS,与现有的基于Intel的x86_64架构不同,模拟器也将在arm64架构上运行。
Xcode通常依靠“运行目标”来构建其库/应用程序。因此,当模拟器被选择为“运行目标”时,它将为可用的模拟器体系结构构建应用程序,而当设备被选择为“运行目标”时,则将为设备支持的体系结构构建arm*
。
xcodebuild
认为arm64
是模拟器的有效架构。所以,当一个模拟器被选为运行目标,它可能尝试编译/对arm64
基于模拟器以及链接您库/应用程序(尚未公布)。因此,它以{architecture>-clang(++)
到arm64-apple-ios13.0-simulator
之类的-target标志,clang尝试针对基于arm64的模拟器构建/链接,该模拟器最终失败基于Intel的Mac。
但是xcodebuild
仅针对发布版本尝试此操作。为什么?因为“仅构建活动体系结构(ONLY_ACTIVE_ARCH
)”构建设置通常仅对“发布”配置设置为“否”。这意味着xcodebuild
将尝试为发行版本的选定运行目标构建libs / apps的所有体系结构变体。对于模拟器的运行目标,它现在将同时包含x86_64
和arm64
,因为Xcode 12+中的arm64
也是模拟器的受支持体系结构,支持Apple Silicon。
简单地说,Xcode在尝试使用命令行xcodebuild
(默认为发布版本,请参见项目设置的常规选项卡)或任何其他方式在 release < / strong>模式。因此,解决此问题的简单方法是在您的库/应用程序中将“仅构建Active Architecture(ONLY_ACTIVE_ARCH
)”设置为是,即使对于发布模式也是如此。
如果库包含在Pod中,并且您有权访问.podspec
,则只需设置以下内容即可:
spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH'=>'是'}
spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH'=>'是'}# 推荐
我个人不喜欢自pods shouldn't pollute the target project以来的第二行,它可能会在目标设置本身中被覆盖。因此,用某种方式覆盖设置应该是用户项目的责任。但是,这可能是成功剔除podspec的必要条件。
但是,如果您无权访问.podspec
,则可以始终在安装Pod的过程中更新设置:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
我担心的一件事是,当我们实际存档libs / apps时,这会产生什么影响。在归档过程中,应用程序通常采用“发布”配置,由于这将仅考虑当前运行目标的活动体系结构来创建发行版本,因此使用此方法,我们可能会丢失目标版本的armv7,armv7s等。但是,我注意到文档说(在附图中突出显示),当我们选择“ Generic iOS Device / Any Device”作为运行目标时,此设置将被忽略,因为它没有定义任何特定的体系结构。因此,我想如果我们将应用程序选择为运行目标来存档,那应该会很好。
答案 2 :(得分:67)
答案 3 :(得分:45)
“有效体系结构”构建设置已在Xcode 12中删除。如果此构建设置中包含值,则它们会引起问题,需要将其删除。
通过将其重新添加为用户定义的构建设置(无值),运行项目(失败),然后删除VALID_ARCHS构建设置,我能够“清除” VALID_ARCHS构建设置。之后,我就可以在模拟器上运行了。
“我的体系结构”构建设置为“标准体系结构”。
您可以通过“构建设置”中的加号按钮添加用户定义的设置:
答案 4 :(得分:24)
我意识到这个问题有点老了,但建议的答案已经过时/不正确。
您应该首先尝试更新 CocoaPods 和库/应用程序的依赖项,然后,如果这不起作用,请联系您正在使用的任何依赖项的供应商,看看他们是否正在进行更新以在 M1 Mac 上添加对 arm64 模拟器切片的支持。
这里有很多答案标记为正确,建议您将 arm64 从支持的体系结构列表中排除。这充其量只是一个非常临时的解决方法,最坏的情况是它会将这个问题传播到您的库的其他使用者。如果您排除 arm64 Simulator slice,则会对您在 Simulator 中开发的应用程序的性能产生影响(这反过来会导致您在开发您的惊人想法时为闪亮的新 M1 套件缩短电池时间)。< /p>
答案 5 :(得分:11)
如果您在Xcode 12中使用模拟器(而不是真实设备)遇到问题,是的,您必须删除VALID_ARCHS 设置,因为它不再受支持。转到“构建设置”,搜索“ VALID_ARCHS ”,然后删除用户定义的属性。在您拥有的每个目标中进行操作。
仍然,您可能需要在Podfile的底部添加一个脚本,以使Pod使用正确的体系结构和部署目标进行编译:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
end
end
end
答案 6 :(得分:8)
升级到Xcode 12之后,我仍然可以为真实设备构建程序,但不能为模拟器构建程序。 Podfile构建仅适用于实际设备。
我在“构建设置”>“用户定义”下删除了VALID_ARCHS,它起作用了!在发现它之前要先head头。
答案 7 :(得分:7)
答案 8 :(得分:7)
我发现了
Build Active Architecture Only
设置为 YES
,用于项目和目标中的所有内容podfile
中:post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
为我工作。
我们同时拥有 Pod 和 SPM,但它们不适用于其他答案的任何组合。我的同事都在使用 Intel MacBooks,一切仍然对他们有用!
答案 9 :(得分:6)
我相信我找到了答案。根据Xcode 12 beta 6发行说明:
“ “构建设置”编辑器不再包含“有效体系结构”构建设置(VALID_ARCHS),不鼓励使用它。而是有一个新的“排除体系结构”构建设置(EXCLUDED_ARCHS)。如果项目包含VALID_ARCHS,则设置显示在“构建设置”编辑器的“用户定义”部分。(15145028)“
我能够通过手动编辑项目文件(我不知道如何使用Xcode从项目文件中删除项目)并删除所有引用VALID_ARCHS的行来解决此问题。之后,我就可以为模拟器构建好了。
答案 10 :(得分:6)
答案 11 :(得分:6)
1.在所有目标中将 arm64
添加到 Build settings
-> Exclude Architecture
。
2.关闭Xcode并按照以下步骤打开
答案 12 :(得分:6)
答案 13 :(得分:5)
在您的xxx.framework podspec文件中,添加以下配置 避免pod包中包含arm64相似的弓形符号
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
答案 14 :(得分:5)
我通过在“排除的体系结构”中为项目目标和pod目标添加“ arm64”来解决问题。
Xcode->目标项目->构建设置->排除的体系结构>“ arm64”
Xcode-> Pod目标->构建设置->排除的体系结构>“ arm64”
答案 15 :(得分:4)
答案 16 :(得分:3)
针对Pod开发人员 在您的Podspec中添加:
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
看到它运作in this project
答案 17 :(得分:3)
请不要忘记在将 arm64 添加到排除的架构后清理构建文件夹。
答案 18 :(得分:3)
答案 19 :(得分:3)
我在从命令行构建框架时遇到了问题。我的框架依赖于其他缺少对基于ARM的模拟器的支持的框架。我最终不支持基于ARM的模拟器,直到升级依赖项为止。
从CLI构建模拟器框架时,我需要EXCLUDED_ARCHS=arm64
标志。
xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64
答案 20 :(得分:3)
尝试了该线程上的几乎所有帖子并浏览了苹果开发人员论坛后,我发现只有一种解决方案对我有用。
我正在构建一个在快速应用程序中使用的通用框架。没有架构错误,我无法构建到模拟器。
在您的情况下,在我的Framework项目中,我的构建阶段中有一个Universal Framework任务
d
任务中:
xcodebuild
接下来,您必须更改以下项目EXCLUDED_ARCHS="arm64"
:
Build Settings
用户定义的设置VALID_ARCHS
设置为ONLY_ACTIVE_ARCH
*** ***如果您正在开发框架并且还具有演示应用程序,则必须在两个项目中都启用此设置。
答案 21 :(得分:1)
就我而言,它 100% 有效,试试这个 -
我有一个临时解决方案
你只需按照图片
double click of architecture
并选择 other
和 remove all lines
并添加两个内容 arm7s and arm7
并在 iPhone Not 模拟器中运行你的物理设备
并享受....
答案 22 :(得分:1)
我也遇到了通过迦太基安装的特定库的相同问题。 对于那些正在使用Carthage的用户,由于Carthage在Xcode 12中无法立即使用,因此本文档将指导您一种适用于大多数情况的变通方法。 好吧,不久,迦太基建立了胖的框架,这意味着该框架包含所有受支持的体系结构的二进制文件。在引入Apple Sillicon之前,所有功能都可以正常工作,但是由于存在重复的架构(用于设备的arm64和用于模拟器的arm64),现在存在冲突。这意味着迦太基无法将特定于架构的框架链接到单个胖框架。
您可以按照此处的说明进行操作。 Carthage XCODE 12
然后在配置迦太基之后。将arm64放在构建设置的“排除的体系结构”中。
尝试使用模拟器运行项目。模拟器应该可以正常运行。
答案 23 :(得分:1)
我了解arm64和Xcode 12的问题,并且可以通过排除iPhone Simulator的arm64体系结构或为Release scheme设置ONLY_ACTIVE_ARCH来解决构建问题。但是,在使用pod repo push推送框架时,我仍然遇到问题。
我发现在我的podspec中设置s.pod_target_xcconfig不会将此设置应用于同一podspec中定义的依赖项。我可以在验证期间Cocoapods生成的虚拟App项目中看到它。 Cocoapods验证正在运行模拟器的发布方案,并且当一个或多个依赖项不排除arm64或未设置为仅构建活动体系结构时,此操作将失败。
一种解决方案可能是强制Cocoapods在验证项目时添加安装后脚本,或者让其构建Debug方案,因为Debug方案仅在构建活动体系结构。
我最终使用Xcode 11释放了pod并通过了验证。您可以从developer.apple.com下载Xcode 11,将其作为Xcode11.app复制到Applications文件夹,然后使用sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developer
进行切换。完成操作后,别忘了切换回去。
答案 24 :(得分:1)
仅将Any iOS Simulator SDK -> x86_64
添加到Project's Build Settings -> VALID_ARCHS
对我有用。
Xcode版本:12.1(12A7403)
如果您的项目包含一些不支持x86_64的框架。
xxx.framework
)添加到Target -> Build Settings -> Excluded Source File Names -> Debug -> Any iOS Simulator SDK
。Framework Search Paths
,以删除Debug -> Any iOS Simulator SDK
的这些框架的路径。这两个设置可以避免Xcode在模拟器模式下构建和链接这些框架。
答案 25 :(得分:1)
答案 26 :(得分:1)
将"Build Active Architecture Only"(ONLY_ACTIVE_ARCH)
的构建设置设置为yes,xcode
由于使用arm64的Silicon MAC架构而要求使用arm64。
arm64已在Xcode12中添加为模拟器拱门,以支持Silicon MAC。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json
答案 27 :(得分:1)
在我的情况下:Xcode 12
我在EXCLUDED_ARCHS
上设置了空值,并设置了ONLY_ACTIVE_ARCH
Debug = YES
Release = NO
Project's Build Setting
并且我将其包含在我的Podfile中:
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)上运行
答案 28 :(得分:1)
这里的问题是Xcode 11中的有效架构,在Xcode 11中打开项目,并将项目,目标和Pod的有效架构值更改为$(ARCHS_STANDARD),然后在Xcode 12中重新打开项目并进行构建
答案 29 :(得分:0)
就我而言,我试图以Relese模式在watchOS 7模拟器上运行,但iOS 14模拟器处于Debug模式。
因此,只需将两个模拟都置于Debug / Release模式即可为我解决问题!
答案 30 :(得分:0)
就我而言,更新 cocoapods
有帮助:
如果安装了 cocoapods,请卸载:
sudo gem uninstall cocoapods
安装 cocoapods:brew install cocoapods
如果您有链接错误:brew link --overwrite cocoapods
运行pod install
答案 31 :(得分:0)
在我们的例子中,这是 Jenkins 构建中的一个错误:
<块引用>框架/发布' xxx/Library/Developer/Xcode/DerivedData/xxx-cuytrcyjdlfetmavpdonsknoypgk/Build/Products/Debug-iphoneos/AppsFlyerLib.framework/AppsFlyerLib(AFSDKDevice.o), 为 iOS 构建,但链接为 Mac Catalyst 构建的目标文件, 文件 'xxx/Library/Developer/Xcode/DerivedData/xxx-cuytrcyjdlfetmavpdonsknoypgk/Build/Products/Debug-iphoneos/AppsFlyerLib.framework/AppsFlyerLib' 用于架构 arm64
我们使用 sudo gem update cocoapods
修复了它。
答案 32 :(得分:0)
在排除架构中的上图中 -> 在调试和发布中点击 + 按钮 -> 在调试和发布中
答案 33 :(得分:0)
我在模拟器/swiftUI 预览中遇到了同样的问题,并显示以下警告:
ld:警告:忽略文件 Pods/.../X.xcframework/ios-arm64_armv7/X.xcframework/X,文件中缺少所需的架构 x86_64 忽略文件 Pods/.../X.xcframework/ios-arm64_armv7 /X.xcframework/X(2 个切片)
我在项目设置的框架搜索路径中有递归路径 $(SRCROOT)。删除它后,项目构建没有错误。
答案 34 :(得分:0)
我遇到了同样的问题,并试图在 Mac M1 上启动 React Native 应用程序。请注意,我的具有相同项目的 Intel Mac 运行良好,没有出现此错误。 对我来说解决问题的是强制 Xcode 通过 Rosetta 打开。
要实现这一点: 右键单击应用程序文件夹中的 Xcode > 获取信息 > 选中“使用 Rosetta 打开”复选框。
答案 35 :(得分:0)
答案 36 :(得分:0)
就我而言:
我有4种配置(+ DebugQa和ReleaseQa) Cocoapods用作依赖管理器
对于Debug,我聚集在设备和模拟器上,并且仅在设备上的qa上聚集。
它有助于在PodsProject中将BuildActiveArchitecture设置为yes
答案 37 :(得分:0)
遇到这个问题时,我正在尝试构建 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}
答案 38 :(得分:0)
分享对我有用的解决方案,这可能会对某人有所帮助
为模拟器编译时出现的问题:
针对iOS Simulator进行构建,但链接至针对iOS ARM64架构而构建的目标文件中
XCODE 12.1, POD 1.9.1
我的项目结构
arm64
添加到构建设置-> Exclude Architecture
。arm64
中删除了VALID_ARCHS
,并在所有目标中添加了x86_64
。在podfile
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
end
已pod update
,已删除podfile.lock
并已pod install
进行干净的构建。
答案 39 :(得分:0)
将“构建配置”切换回“调试”模式,或仅针对“调试”和“发布”模式启用“构建活动体系结构”。 原因是您的库/框架不支持新的模拟器架构ARM64(在具有Apple Silicon处理器的Mac上运行)
答案 40 :(得分:0)
排除arm64之后,我总是得到ARCHS [@]:未绑定变量。对我来说,唯一的解决方案是将x86_64添加到目标构建设置,如此处所述Problems after upgrading to Xcode 12:ld: building for iOS Simulator, but linking in dylib built for iOS, architecture arm64。您还可以删除之前添加的exclude arm64。
答案 41 :(得分:0)
将“ arm64”行(不带引号)添加到路径:Xcode->项目->构建设置->体系结构->排除的体系结构 另外,对Pod执行相同的操作。在这两种情况下,调试和发布字段都是如此。
或详细...
在使用Xcode 12部署到模拟器时,这里提到的错误也是影响我的事情之一。只需右键单击每个项目并在finder中显示,在Atom中打开.xcodeproj,然后遍历.pbxproj并删除所有VALIDARCHS设置。这就是它为我工作的原因。 尝试了其他一些建议(不包括arm64,仅构建活动架构),这似乎使我的构建更进一步,但最终使我陷入另一个错误。最好先检查一下VALIDARCH设置,然后检查。
答案 42 :(得分:0)
在线尝试了很多无用的答案之后。这对我有用。
首先,为Pod项目生成x86_64 !!!
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ARCHS'] = "arm64 x86_64"
end
end
end
第二,为VALID_ARCHS添加“ x86_64”
答案 43 :(得分:-1)
这似乎是 M1 和可可豆荚的问题。排除 arm64 对我有用,但它导致了其他问题(即没有这样的模块 X)。这对我有用,而且您不需要从每个构建中排除 arm64。
在 Rosetta 中打开终端
为此,在 Finder 中右键单击终端 --> 获取信息 --> 在 Rosetta 中选中打开
安装 ffi
sudo arch -x86_64 gem install ffi
重新安装依赖
arch -x86_64 pod install
您可以立即禁用 Rosetta,它仍然可以工作。
确保 当您尝试再次构建您的项目时,您没有排除 arm64,它会导致同样的问题。它应该从那里工作。 这也仅适用于系统版本的 Ruby,它不适用于可可豆荚的 Ruby 2.7。
答案 44 :(得分:-1)
答案 45 :(得分:-3)
要使其适用于Calabash自动化测试
有一个拉出请求可以解决xcode 12无法与瓢虫一起使用的问题 https://github.com/calabash/run_loop/pull/757
一个临时解决方案是使用此WIP分支,尽管因为它是PR草案,所以不一定要使用它。希望将来对Xcode 12支持Calabash。
更改您的Gemfile
gem "run_loop"
到
gem 'run_loop', git: 'https://github.com/calabash/run_loop.git', branch: 'xcode_14_support'