架构 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】:

如果你的 ArchitecturesValid 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 命令来判断静态库支持哪些架构。 刚来到这里是为了加入合唱:为 BUILD FOR ACTIVE ARCHITECTURES 选择 YES 是这里的最佳选择。 这不再是一个解决方案。 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 armv7sBuild 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.dyliblibz.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... 删除iosbuild_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 deintegrateios/Podfile 中评论此行 -> use_flipper!() 重新安装所有 pod arch -x86_64 pod install 运行您的应用程序 :) npm run ios

环境: 节点版本:14.17.1 RN 版本:6.0.0 操作系统:macOS BigSur m1

【讨论】:

以上是关于架构 arm64 的未定义符号的主要内容,如果未能解决你的问题,请参考以下文章

Crashlytics错误:架构arm64的未定义符号

XCode - 架构 armv7 arm64 的未定义符号

架构 arm64 的未定义符号:“cv::String::deallocate()”

删除/重新添加文件,现在我得到架构 arm64 的未定义符号:

Unity AR Foundation Xcode 项目中架构 arm64 的未定义符号

架构 arm64 的未定义符号:Crashlytics (CLSBetaController.o) 中的 CLSBetaController 块调用