架构 arm64 的未定义符号
Posted
技术标签:
【中文标题】架构 arm64 的未定义符号【英文标题】:Undefined symbols for architecture arm64 【发布时间】:2013-10-06 20:47:29 【问题描述】:每次从 CocoaPods 导入文件时,我都会收到 Apple Mach-O 链接器错误。
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_FBSession", referenced from: someFile
ld: symbol(s) not found for architecture arm64
对于我使用的各种 Pod,我得到了大约 12 个。
我正在尝试使用 XCode 5 为 iPhone 5S 构建。
我在 SO 上尝试了各种解决方案,但还没有任何一个可以工作。
如何解决这个 Apple Mach-O 链接器错误?
刚刚发现另一个可能很有趣的警告,我希望这能引导我找到解决方案:
Ignoring file ~/Library/Developer/Xcode/DerivedData/SomeApp/Build/Products/Debug-iphoneos/libPods.a,
file was built for archive which is not the architecture being linked
(arm64):~/Library/Developer/Xcode/DerivedData/someApp/Build/Products/Debug-iphoneos/libPods.a
【问题讨论】:
简单解决方案转到目标 -> 链接 -> 其他链接器标志并在调试和发布中的其他链接器标志中添加 $(inherited)。 【参考方案1】:如果你的 Architectures 和 Valid Architectures 没问题,你可以检查你是否在 其他链接器标志如下:
【讨论】:
@chancyWu 你能解释一下吗? 如果这仍然不起作用,请将 @(inherited) 添加到库搜索路径。 大声笑,忽略Use the $(inherited) flag
终端警告。错误把我带到了这里。拯救了我的一天。
我正在使用 Xcode 7.2 和其他链接器标志 -> 调试我看到: -weak_framework CoreFoundation -weak_framework UIKit -weak_framework AVFoundation -weak_framework CoreMedia -weak-lSystem -ObjC ...我在这里添加$(inherited) 但它不起作用
你节省了我很多时间。谢谢。【参考方案2】:
问题是 cocoapods 尚未为 arm64 架构构建,因此在构建它们时无法链接它们。在更新并使用该架构之前,您可能无法使用这些包。您可以通过转到项目 -> 目标(您的项目名称)-> 构建设置并将架构更改为标准架构(armv7、armv7s)并将有效架构更改为 armv7、armv7s 来修复链接器错误。
但请注意,这意味着您将无法获得 64 位处理器的全部功能。你说你正在为 5s 构建,所以你可能有一些原因需要这个。如果您出于某种原因绝对需要该功能(也许您正在构建游戏),并且迫切需要这些文件,您可以提交一个拉取请求,然后通过在您提取的文件中将这些相同的字段设置为 arm64 来将项目重新编译为 arm64开源项目。但是,除非您真的需要这些文件兼容 64 位,否则现在这似乎有点矫枉过正。
编辑:有些人还报告说,将 Build For Active Architectures 设置为 YES 也是解决此问题所必需的。
截至 2014 年 4 月 28 日,设置应如下所示:
【讨论】:
这解决了在模拟器上运行的错误,但是并没有解决在设备上运行的错误。 Pods 被 libPods.a 拒绝,因为它的架构 ''(由于某种原因,它没有检测到它 - 尽管我可以在 Xcode 中看到它)不包含所有必需的架构 'armv7 armv7s' 好的,我通过将 Build For Active Architectures 设置为 Yes 来实现这一点。非常感谢! 旁白:您可以在终端中使用file
命令来了解静态库支持的架构。
刚来到这里是为了加入合唱:选择 YES 为 BUILD FOR ACTIVE ARCHITECTURES 是这里的最佳选择。
这不再是一个解决方案。 Apple 现在要求所有部署都支持 64 位。【参考方案3】:
我通过设置解决了这个问题:
ARCHS = armv7 armv7s
VALID_ARCHS = armv6 armv7 armv7s arm64
【讨论】:
我在第一次使用 XCode 5.1 时遇到了类似的问题,这解决了它。谢谢! @morisunshine 你确定吗,你在构建后检查过二进制架构吗? @onmyway133 查过了,现在新的XCode中没有遇到这个问题。 @morisunshine 是的,我的意思是你失去了 arm64 没有更多的构建错误,到目前为止一切正常。但是在上传存档版本时,我收到 arm64 位丢失错误,因为 arm64 位支持是 2015 年 2 月 1 日起的强制要求。【参考方案4】:我在实现 AVPictureInPictureController
时遇到了相同/类似的问题,问题是我没有在我的项目中链接 AVKit 框架。
错误信息是:
Undefined symbols for architecture armv7:
"_OBJC_CLASS_$_AVPictureInPictureController", referenced from:
objc-class-ref in yourTarget.a(yourObject.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方案:
-
转到您的项目
选择您的目标
然后,转到构建阶段
打开 将二进制文件链接到库
最后,只需添加 + AVKit 框架 / 任何其他框架。
希望这可以帮助遇到我遇到类似问题的其他人。
【讨论】:
是的,值得一提的是,如果您缺少框架,则会引发此错误。一条线索是您尝试删除架构,而下一个/剩余的架构也失败了...... 干得好。 ` "_OBJC_CLASS_$_XXXXXClass", 引用自:`,, 添加xxx框架。 看准了!任何看到任何带有“xml”打印的东西的人都可以检查一下——在我的例子中,它是“libxml”框架没有被链接。 修改pod的引入后出现这个错误,所有方法都没有修复。但是你的方法解决了这个问题。注意:无法搜索lib。【参考方案5】:我也遇到了同样的问题,以上方法都不行。我不小心把下面目录下的文件删了就可以了。
文件夹位置:
~/Library/Developer/Xcode/DerivedData/
【讨论】:
这看起来很奇怪,但实际上它确实有效。谢谢,伙计。 手动删除派生数据,对我也有用。干杯! 谢谢!我想添加一个提示:文件夹在 /User/yourname/Library/Developer/XCode/DerivedData 您还应该能够使用终端删除派生数据:rm -rf ~/Library/Developer/Xcode/DerivedData 节省了我的时间...XDDD【参考方案6】:将 Architectures 设置为 armv7 armv7s,Build Active Architecture Only 设置为 NO , 对于项目中的每个目标,包括 Pods
中的每个【讨论】:
工作排序...现在我收到“无效的位码签名”错误。【参考方案7】:我通过检查右侧目标成员中选定的实现文件来修复我的问题。这在处理扩展(即自定义键盘)时尤其有用。
【讨论】:
Xcode 9 不会自动应用它,即使选中了复选框。谢谢。 这就是问题所在。谢谢你 我在工作中从事的一个非常大的项目也遇到了同样的问题。这是cocoapod地狱。但是,我的解决方案是取消选中我遇到的问题的目标成员资格。感谢您为我指明正确的方向!【参考方案8】:以下是为什么 build_active_architecture
设置为 NO 的一些解释。
Xcode 现在检测您连接了哪些设备,并将相应地设置活动架构。因此,如果您将第二代 iPod Touch 插入计算机,Xcode 应该将活动架构设置为 armv6。使用上述 Debug 配置构建目标现在只会构建 armv6 二进制文件以节省时间(除非您有一个巨大的项目,您可能不会注意到差异,但我猜随着时间的推移,秒数会增加)。
当您创建发布到 App Store 的分发配置时,您应该确保未设置此选项,以便 Xcode 将构建胖通用二进制文件 http://useyourloaf.com/blog/2010/04/21/xcode-build-active-architecture-only.html
【讨论】:
这太令人难以置信了! XCode 的输出取决于你连接到构建机器的设备!【参考方案9】:这可能与libz.dylib
或libz.tbd
有关,只需将其添加到链接二进制文件的目标中,然后再次尝试编译。
【讨论】:
正在尝试添加 Tesseract 框架,只有这对我有帮助,谢谢。 !【参考方案10】:您只需从 Valid Architecture 中删除 arm64 并将 NO 设置为 Active Architecture Only 。现在只需清理、构建和运行。您将不会再看到此错误。
:) KP
【讨论】:
【参考方案11】:删除DerivedData的内容后解决-->Build-->Products-->Debug-iphoneos
【讨论】:
【参考方案12】:我通过将有效的拱门设置为 armv7 armv7s 并将 build active architectures 设置为 YES 来解决它,然后从命令行执行新的“pod install”
【讨论】:
【参考方案13】:鉴于 iPhone 5s 尚未收到第三方库的 64 位版本,我不得不使用最新的 Xcode 回到 32 位模式(在 5.1 之前它没有抱怨)。
我通过从 Valid Architectures 列表中删除 arm64 然后将 Build Active Architecture Only 设置为 NO 来解决此问题。在我看来,这比上面显示的其他方式更有意义。我发帖以防其他人无法获得上述任何解决方案来为他们工作。
【讨论】:
【参考方案14】:升级到 Xcode 5.1 后我遇到了同样的问题,并通过将 Architectures 设置为 armv7 armv7s
来修复它【讨论】:
【参考方案15】:一整天都在这个问题上。
我有多个方案,它可以很好地编译 Demo、Internal、Release - 但是 Debug 方案无法编译并且抱怨 libPods.a 丢失。
解决方案是转到项目 -> 目标 -> 构建设置并将“仅构建活动架构”更改为“是”。清洁和建造!终于解决了几个小时的头痒问题!
【讨论】:
与您的问题不完全相同,但相似。我用你提供的方法解决了。【参考方案16】:在目标的 Build Settings 中将 -ObjC
设置为 Other Linker Flags
解决了这个问题。
【讨论】:
【参考方案17】:这对我有用:
ios SDK 9.3
进入 app.xcodeproj 的构建设置 有效架构:armv7 armv7s 构建活动架构:否
清理和构建,为我工作。
【讨论】:
【参考方案18】:如果您在以发布模式(或存档)构建时在 Flutter 项目中遇到此问题,请查看我的答案:https://***.com/a/61446892/5502121 长话短说:
在文件 > 项目设置中将您的构建系统设置为 New Build System... 删除ios
和build_ios
文件夹
运行flutter create .
以初始化新的ios
模块
运行pod install
运行flutter pub get
检查您的 Xcode 构建配置(应该是 Release 模式和 General iOS Device)
你很高兴
【讨论】:
【参考方案19】:以下内容对我有用,让我在 Xcode 5.1 上为 64 位模拟器和视网膜 iPad Mini 无错误地编译 GPUImage, 无需从有效架构列表中删除 arm64(这击败了目的是拥有一台 64 位设备来测试 64 位性能)。
从 GitHub 页面下载 .zip 文件夹:https://github.com/BradLarson/GPUImage
解压缩并导航到“框架”文件夹。从这里,将“Source”文件夹添加并复制到您的 Xcode 项目中。确保勾选了“将项目复制到目标组的文件夹”,并且还勾选了“为任何添加的文件夹创建组”。这会将通用、iOS 和 Mac 头文件/实现文件复制到您的项目中。
如果您不需要 Mac 文件,因为您正在为 iOS 编译,您可以在将文件复制到项目之前删除 Mac 文件夹,或者直接从 Xcode 中删除组。
将 Source 文件夹添加到项目后,只需使用以下内容即可开始使用 GPUImage 的类/方法:
#import "Source/GPUImage.h"
需要指出的几点:
如果您收到错误提示“未找到 Cocoa”,则表示您已将 Mac 文件夹/头文件添加到您的 iOS 项目中 - 只需从项目中删除 Mac 组/文件,警告就会消失 如果重命名 Source 文件夹(不是 Xcode 中的组),请在 #import 指令中使用该名称而不是“Source/GPUImage.h”。因此,如果在添加到项目之前将文件夹重命名为 GPUImageFiles,请使用:#import "GPUImageFiles/GPUImage.h 显然确保在有效架构列表中选择 arm64 以利用 A7 64 位处理器! 这不是 GPUImage.framework 包(例如,如果您从 http://www.raywenderlich.com/60968/ios-7-blur-effects-gpuimage 下载了框架),因此它可能不是 Brad Larson 想要的使用 GPUImage 的正确方法,但它适用于我当前的 SpriteKit 项目。 无需链接到框架/库等 - 只需如上所述导入标头和实现源文件夹希望以上内容有所帮助 - 尽管问题被多次询问,但似乎没有明确的说明,但不要担心,GPUImage 绝对适用于 arm64 架构!
【讨论】:
【参考方案20】:我在通过 Podfile 和 pod install
安装 pod 后出现此问题。在尝试了一堆不同的修复后,我终于手动导入了 Pod(将必要的文件拖到我的项目中)并解决了问题。
【讨论】:
这对我也有用,但它是一个带有一个文件的简单 pod。【参考方案21】:由于morisunshine 的回答指向了正确的方向,他的回答中的一些小调整解决了我的 iOS8.2 问题。感谢他。
我通过设置解决了这个问题:
ARCHS = armv7
VALID_ARCHS = armv6 armv7 armv7s arm64
BUILD ACTIVE ARCHITECTURE ONLY= NO
【讨论】:
【参考方案22】:-
转到目标构建设置。
设置 BUILD ACTIVE ARCHITECTURE ONLY = NO 用于调试和发布
构建并运行
【讨论】:
在 PODS 项目中也将 BUILD ACTIVE ARCHITECTURE ONLY 设置为 NO!【参考方案23】:就我而言,我不得不寻找
C++ Standard Library
并确保 libc++
是被选中的那个。
【讨论】:
【参考方案24】:对于我来说,我在 xcode 7.2 for iOS 中使用 opencv 2.4.9 并出现上述错误,我通过 pod install 而不是离线 opencv 框架使用 opencv 来解决错误。
你可以在下面添加opencv pod文本试试看,如果你用过,可以删除离线opencv框架。
pod 'OpenCV', '2.4.9'
【讨论】:
【参考方案25】:在我的情况下(Xcode 9),没有任何解决方案可以修复此错误,TesseractOCRiOS
。经过数小时的反复试验,我想出了一个很好的解决方案。我只是删除了Podfile
中的'pod 'TesseractOCRiOS', '~> 4.0.0'
,运行pod install
。然后,将pod 'TesseractOCRiOS', '~> 4.0.0'
添加回Podfile
并再次运行pod install
。
砰!有用!
【讨论】:
【参考方案26】:“OPN [Debug] 目标覆盖 OTHER_LDFLAGS 构建设置”。这是主要问题。在其他链接器标志的新行中添加 $(inherited) 后解决了我的问题。
【讨论】:
【参考方案27】:在某些情况下,如果您在 .h 文件中定义了多个接口,但没有实现所有这些接口,则会发生此错误。
链接器在 .m 文件中找不到实现,因此您需要在每个接口的 .m 文件中实现它。
要解决此错误:
1.在.m 文件中,提供每个接口的实现。 2.重建
【讨论】:
【参考方案28】:我遇到了同样的问题。 我在这里找到的解决方案:Why linker link static libraries with errors? iOS
将 $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) 添加到 库搜索路径 解决了问题。
【讨论】:
【参考方案29】:这个错误消耗了我一整天,所以想写出真正对我有用的东西
-
删除 .xworkspace
删除 podfile.lock
删除 Pods 文件夹/目录
"不要删除 PODFILE"
在这一切之后,CLEAN(OPTION + SHIFT + CMD + K) --> BUILD(CMD + B) --> RUN(CMD + R)
我希望这真的对你有用:)
【讨论】:
【参考方案30】:以下对我有用:
-
删除所有 pod
cd ios && pod deintegrate
在ios/Podfile
中评论此行 -> use_flipper!()
重新安装所有 pod arch -x86_64 pod install
运行您的应用程序 :) npm run ios
环境: 节点版本:14.17.1 RN 版本:6.0.0 操作系统:macOS BigSur m1
【讨论】:
以上是关于架构 arm64 的未定义符号的主要内容,如果未能解决你的问题,请参考以下文章
架构 arm64 的未定义符号:“cv::String::deallocate()”
删除/重新添加文件,现在我得到架构 arm64 的未定义符号:
Unity AR Foundation Xcode 项目中架构 arm64 的未定义符号
架构 arm64 的未定义符号:Crashlytics (CLSBetaController.o) 中的 CLSBetaController 块调用