架构arm64的未定义符号

时间:2013-10-06 20:47:29

标签: ios xcode xcode5 cocoapods

每次从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

43 个答案:

答案 0 :(得分:229)

如果体系结构有效体系结构都可以,您可以检查是否添加了$(inherited),它将添加在pod中生成的链接器标记,以其他链接标记如下: enter image description here

答案 1 :(得分:120)

问题是cocoapods还没有为arm64架构构建,因此在构建它们时无法链接它们。在更新并使用该架构之前,您可能无法使用这些软件包。您可以通过转到项目来修复链接器错误 - > target(您的项目名称) - >构建设置并将架构更改为标准体系结构(armv7,armv7s),以及armv7,armv7s的有效体系结构。

但请注意,这意味着您无法获得64位处理器的全部功能。你说你正在建造5s,所以可能有一些原因你需要这个。如果你出于某种原因绝对需要这种能力(也许你正在构建一个游戏),并且迫切需要这些文件,你可以提交一个拉取请求,然后通过在你从中提取的文件中将那些相同的字段设置为arm64,将项目重新编译为arm64开源项目。但是,除非你真的需要这些文件与64位兼容,否则现在看起来有点矫枉过正。

编辑:有些人还报告说,将Build For Active Architectures设置为YES也是解决这个问题的必要条件。

截至2014-04-28,设置应如下所示:

enter image description here

答案 2 :(得分:52)

我通过设置:

解决了这个问题

ARCHS = armv7 armv7s

VALID_ARCHS = armv6 armv7 armv7s arm64

答案 3 :(得分:36)

我遇到了实施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)

解决方案:

  1. 转到项目
  2. 选择目标
  3. 然后,转到构建阶段
  4. 打开链接二进制文件库
  5. 最后,只需添加 + AVKit 框架 /任何其他框架
  6. 希望这可以帮助其他人遇到类似的问题。

答案 4 :(得分:33)

我也遇到了同样的问题,上面的方法都行不通。我不小心删除了下面目录中的文件。

文件夹安置:

〜/库/开发商/ Xcode中/ DerivedData /

enter image description here

答案 5 :(得分:25)

架构设置为 armv7 armv7s 仅构建活动架构 ,对于项目中的每个目标,包括 Pods

中的每一个

答案 6 :(得分:16)

我通过检查右侧目标成员资格中的选定实施文件来修复我的问题。这在处理扩展即自定义键盘时特别有用。

Target Membership

答案 7 :(得分:11)

解释为什么build_active_architecture设置为NO。 Xcode现在可以检测您已连接的设备,并相应地设置活动架构。因此,如果您将第二代iPod Touch插入计算机,Xcode应将活动架构设置为armv6。使用上面的Debug配置构建你的目标现在只会构建armv6二进制文件以节省时间(除非你有一个庞大的项目,你可能没有注意到差异,但我想随着时间的推移,秒数会增加。)

创建用于发布到App Store的分发配置时,应确保未设置此选项,以便构建胖通用二进制文件 http://useyourloaf.com/blog/2010/04/21/xcode-build-active-architecture-only.html

答案 8 :(得分:5)

删除DerivedData的内容后解决 - > Build - > Products - > Debug-iphoneos

答案 9 :(得分:4)

您只需从有效架构中删除 arm64 ,并将设置为仅限Active Architecture 。现在只需清理,构建和运行。您不会再次看到此错误。

:) KP

答案 10 :(得分:4)

这可能与libz.dyliblibz.tbd有关,只需将其添加到目标链接二进制文件中,然后再尝试编译。

答案 11 :(得分:3)

整天都被困在这个问题上。

我有多个Schemes,它正在编译Demo,Internal,Release - 但是Debug方案不会编译并且抱怨libPods.a缺失。

解决方案是进入项目 - >目标 - >构建设置并更改"仅构建活动架构"是的。清洁和建造!最后几个小时头痒解决了!

答案 12 :(得分:3)

我通过将有效的archs设置为armv7 armv7s并在构建时将构建活动架构设置为YES,然后从命令行执行新的“pod install”来解决它

答案 13 :(得分:3)

考虑到iPhone 5s还没有收到64位版本的第三方库,我不得不使用最新的Xcode回到32位模式(5.1之前并没有抱怨)。

我通过从Valid Architectures列表中删除arm64,然后将Build Active Architecture Only设置为NO来解决此问题。在我看来,如上所示,这比其他方式更有意义。我发帖以防其他人无法获得上述任何解决方案。

答案 14 :(得分:3)

升级到Xcode 5.1后我遇到了同样的问题,并通过将架构设置为 armv7 armv7s

来修复它

答案 15 :(得分:2)

在目标的构建设置中将-ObjC设置为Other Linker Flags解决了问题。

答案 16 :(得分:2)

这对我有用:

ios sdk 9.3

进入app.xcodeproj的构建设置 有效的架构:armv7 armv7s 构建活动架构:否

清洁和建造,为我工作。

答案 17 :(得分:1)

在我的情况下,我不得不寻找

C++ Standard Library并确保libc++是所选的。

答案 18 :(得分:1)

morisunshine回答指向正确的方向时,他的答案中的一点调整解决了我对iOS8.2的问题。谢谢他。

我通过设置:

解决了这个问题
ARCHS = armv7

VALID_ARCHS = armv6 armv7 armv7s arm64

BUILD ACTIVE ARCHITECTURE ONLY= NO

答案 19 :(得分:1)

这个错误消耗了我一整天,所以想写一些对我有用的东西

  1. 删除 .xworkspace
  2. 删除 podfile.lock
  3. 删除 Pods 文件夹/目录

"请勿删除 PODFILE"

毕竟,CLEAN(OPTION + SHIFT + CMD + K) --> BUILD(CMD + B) --> RUN(CMD + R)

我希望这对你有用:)

答案 20 :(得分:1)

如果在发布模式(或存档)下进行构建时,在Flutter项目上遇到此问题,请查看我的答案:https://stackoverflow.com/a/61446892/5502121 长话短说:

    在文件>项目设置…中
  • 将构建系统设置为新构建系统
  • 删除iosbuild_ios文件夹
  • 运行flutter create .以初始化新的ios模块
  • 运行pod install
  • 运行flutter pub get
  • 检查您的Xcode构建配置(应为发布模式和常规iOS设备

你很好走

答案 21 :(得分:1)

在某些情况下,如果您在.h文件中定义了另一个接口,但未实现所有这些接口,则会发生此错误。

链接器在.m文件中找不到实现,因此您需要为每个接口在.m文件中实现。

要解决此错误:

1.in .m文件,提供每个接口的实现。 2.重建

答案 22 :(得分:1)

对我来说,我在xcode 7.2中使用opencv 2.4.9 for iOS并且发生了上述错误,我使用opencv through pod install而不是离线opencv框架来解决错误。

您可以尝试在下面添加opencv pod文本,如果已经使用过,请删除脱机opencv框架。

pod'OpenCV','2.4.9'

答案 23 :(得分:1)

对于我来说,在Xcode 5.1上为64位模拟器和视网膜iPad Mini进行GPUImage编译没有错误,没有需要从Valid Architectures列表中删除arm64(这使得失败了拥有64位设备以测试64位性能的目的。)

从GitHub页面下载.zip文件夹:https://github.com/BradLarson/GPUImage

解压缩,然后导航到“framework”文件夹。从这里,添加“Source”文件夹并将其复制到Xcode项目中。确保勾选“将项目复制到目标组的文件夹”,并勾选“为任何添加的文件夹创建组”。这会将通用,iOS和Mac标头/实现文件复制到您的项目中。

如果您因为编译iOS而不需要Mac文件,则可以在将文件复制到项目之前删除Mac文件夹,或者只是从Xcode中删除该组。

将Source文件夹添加到项目后,只需使用以下内容开始使用GPUImage的类/方法:

#import "Source/GPUImage.h" 

要指出的一些事项:

  • 如果您收到错误消息“未找到Cocoa”,则表示您已将Mac文件夹/标题添加到iOS项目中 - 只需从项目中删除Mac组/文件,警告就会消失
  • 如果重命名Source文件夹(不是Xcode中的组),请在#import指令中使用该名称而不是“Source / GPUImage.h”。因此,如果在添加到项目之前将文件夹重命名为GPUImageFiles,请使用:#import“GPUImageFiles / GPUImage.h
  • 显然,确保在Valid Architectures列表中选择arm64以利用A7 64位处理器!
  • 这不是GPUImage.framework包(例如,如果您从http://www.raywenderlich.com/60968/ios-7-blur-effects-gpuimage下载了框架),因此它可能不是使用Brad Larson所期望的GPUImage的正确方法,但它适用于我当前的SpriteKit项目。
  • 没有必要链接到框架/库等 - 只需导入头文件和实现源文件夹,如上所述

希望以上有所帮助 - 尽管问题被多次询问,似乎没有任何明确的指示,但不要担心,GPUImage肯定适用于arm64架构!

答案 24 :(得分:1)

通过Podfile和pod install安装pod后,我遇到此问题。在尝试了一堆不同的修复后,我终于手动导入了Pod(将必要的文件拖到我的项目中),这就解决了问题。

答案 25 :(得分:1)

我的案例(Xcode 9)中没有一个解决方案使用TesseractOCRiOS来修复此错误。经过几个小时的反复试验,我想出了一个很好的解决方案。我只是删除'pod 'TesseractOCRiOS', '~> 4.0.0'中的Podfile,然后运行pod install。然后,将pod 'TesseractOCRiOS', '~> 4.0.0'添加回Podfile并再次运行pod install

砰!有用!

答案 26 :(得分:0)

如果您使用c ++编写的.framework / .a,并在其中调用c ++代码,则需要将其中的文件更改为.mm文件。

我输了半天...

答案 27 :(得分:0)

-ObjC中用$(inherited)代替Other Linker Flags解决了我的问题

答案 28 :(得分:0)

我遇到了同样的问题。 我的解决方案在这里找到:Why linker link static libraries with errors? iOS

库搜索路径中添加 $(TOOLCHAIN_DIR)/ usr / lib / swift / $(PLATFORM_NAME)即可解决此问题。

答案 29 :(得分:0)

将库放置在对我有用的项目的同一文件夹中

答案 30 :(得分:0)

对于在IOS中使用dlib的情况,我需要从构建设置/预处理器宏中删除“继承”。

答案 31 :(得分:0)

此链接器错误消息建议未将定义它的源文件标记为您的应用程序目标的一部分。找到该源文件,然后使用右侧的“文件”属性检查器检查您的应用目标的目标成员资格条目。

解决方案: 选择文件-> openFile检查器->查看目标成员资格->检查是否未选中目标您正在运行的目标

答案 32 :(得分:0)

如果您使用的是 m1 (arm64) 并且遇到问题,您可以在 x86 模式下运行它:

  • 右键单击 xcode 并点按 Get Info 按钮
  • 勾选 Open using Rosetta 选项

它会很慢但有效。

答案 33 :(得分:0)

在构建第二级框架时,我的“ 伞框架”遇到了这个问题。

我通过更改第一层框架针对“通用iOS设备”的构建方案解决了这一问题。我认为这将改变_CodeSignature,当我将整个“伞形框架”推到GitHub时,我看到了不同。

答案 34 :(得分:0)

我的问题是我的项目中已经有一些Facebook SDK(FBSDKLoginKit和FBSDKCoreKit)。

我只需要再添加一个SDK(FBSDKShareKit)并将其导入,这样就提供了“ arm64的未定义符号体系结构”。

由于FBSDKShareKit依赖于FBSDKCoreKit的更新版本,因此通过更新其他框架,一切都会恢复正常。

答案 35 :(得分:0)

“OPN [Debug]目标会覆盖OTHER_LDFLAGS构建设置”。这是主要问题。在其他链接器标志的新行中添加$(继承)解决了我的问题。 enter image description here

答案 36 :(得分:0)

我知道这是一个古老的分支。但是,在迁移到最新的CocoaPods版本(1.0.0)并尝试重新安装所有pod之后,同样的问题开始发生在我身上。我遇到了“armv64缺少符号”链接器错误。 奇怪的是,我通过执行以下步骤解决了这个问题:

  1. 删除所有广告连播(pod init, pod install)

  2. 以相反的顺序重写podfile(而不是: pod“Mixpanel”, pod“对讲机”, 我用了: pod“对讲机”, pod“Mixpanel” )

  3. Pod install

  4. 颠倒podfile中依赖项的顺序并重建pod已解决了这个问题。

答案 37 :(得分:0)

添加“Security.framework”为我做了诀窍。

答案 38 :(得分:0)

如果体系结构和链接器设置看起来不错,请检查您的h文件。我的问题是同样的错误,但我重组了h文件,我删除了一个extern语句。其他m文件正在使用该变量,导致链接器错误。

答案 39 :(得分:0)

  1. 转到目标构建设置。
  2. 仅设置BUILD ACTIVE ARCHITECTURE =调试和发布时为否
  3. 构建并运行

答案 40 :(得分:0)

在安装AWS框架以解决此问题后,我遇到了同样的问题,我已经更新了项目中的POD配置文件,该文件是在安装AWS POD后创建的。检查配置文件如下

OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-AWSAutoScaling" -l"
Pods-   AWSCloudWatch" -l"Pods-AWSCognito" -l"Pods-AWSCore" -l
"Pods-AWSDynamoDB" -l"Pods-AWSEC2" -l"Pods-AWSElasticLoadBalancing" 
-l"Pods-AWSKinesis" -l"Pods-AWSLambda" -l"Pods-AWSMachineLearning" 
-l"Pods-AWSS3" -l"Pods-AWSSES" -l"Pods-AWSSNS" -l"
Pods-AWSSQS"-l "Pods-AWSSimpleDB" -l"Pods-Bolts" -l"Pods-FMDB" 
-l"Pods-GZIP" -l"Pods-Mantle" -l"Pods-Reachability" -l"Pods-TMCache" 
-l"Pods-UICKeyChainStore" -l"Pods-XMLDictionary" -l"sqlite3" -l
"z"-framework "Accelerate" -framework "AssetsLibrary" 
-framework "CoreLocation" -framework "Foundation" -framework
"ImageIO" -framework "Security" -framework "SystemConfiguration"
-framework "UIKit" -weak_framework "UIKit"
 OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS)   

如果您的配置文件无法正常工作,请将其他链接器标记设置为$(继承)

答案 41 :(得分:-1)

detail 希望可以帮到您。我添加了框架,问题已经解决

答案 42 :(得分:-1)

这个解决方案是唯一对我有用的方法: 转到CordovaLib设置并将arm64添加到Valid Architectures。