体系结构arm64的未定义符号


200

每次从CocoaPods导入文件时,我都遇到Apple Mach-O Linker错误。

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


简单的解决方案转到“目标”->“链接”->“其他链接器标志”,然后在“调试”和“发布”中的其他链接器标志中添加$(继承)。
Mihir Oza,

Answers:


248

如果您的体系结构有效体系结构都还不错,则可以检查是否已添加$(inherited),这会将Pod中生成的链接器标志添加到 其他链接器标志中,如下所示: 在此处输入图片说明


7
@chancyWu您能解释一下吗?
Paul Brewczynski

5
如果仍然无法执行此操作,也可以在库搜索路径中添加@(继承)。
Enrico Susatyo 2015年

1
大声笑,忽略了Use the $(inherited) flag终端警告。错误把我带到了这里。拯救了我的一天。
Sushil Sharma 2015年

2
我正在使用Xcode 7.2和其他链接器标记->调试,我看到:-weak_framework CoreFoundation -weak_framework UIKit -weak_framework AVFoundation -weak_framework CoreMedia -weak-lSystem -ObjC ...在这里我添加了$(继承),但它没有t work
Alessandra

你节省了我很多时间。谢谢。
Nirmalsinh

123

问题在于cocoapods尚未针对arm64体系结构构建,因此在构建它们时无法将它们链接在一起。您可能无法使用这些软件包,除非它们被更新并使用该体系结构。您可以通过以下方法修复链接器错误:转到项目->目标(您的项目名称)->构建设置,并将架构更改为标准架构(armv7,armv7s),并将有效架构更改为armv7,armv7s。

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

编辑:有些人还报告说,解决此问题也需要将Build For Active Architectures设置为YES。

从2014-04-28开始,设置应如下所示:

在此处输入图片说明


4
这解决了在模拟器上运行的错误,但是并没有解决在设备上运行的错误。Pods因libPods.a而被拒绝,因为它的体系结构“(出于某种原因,它没有检测到-尽管我可以在Xcode中看到它)没有包含所有必需的体系结构'armv7 armv7s'– GangstaGraham
2013年

7
好的,我通过将Build for Active Architectures设置为Yes来解决这个问题。非常感谢!
GangstaGraham 2013年

2
除了:您可以file在Terminal中使用命令来告诉您静态库支持哪些架构。
funroll

8
刚进入这里是为了增加合唱:在此处为“为活动建筑构建”选择“是”是最佳选择。
2014年

56
这不再是解决方案。苹果现在要求所有部署都支持64位。

52

我通过设置以下方法解决了这个问题:

ARCHS = armv7 armv7s

VALID_ARCHS = armv6 armv7 armv7s arm64


1
第一次使用XCode 5.1时,我遇到了类似的问题,此问题已得到解决。谢谢!
GangstaGraham 2014年

您确定@morisunshine,在构建后检查二进制体系结构了吗?
onmyway133 2014年

@ onmyway133我已经检查过了,但是现在我还没有在新的XCode中遇到这个问题。
morisunshine 2014年

@morisunshine是的,我是说您丢失了arm64
onmyway133 2014年

不再有构建错误,到目前为止,还可以。但是在上传存档的版本时,我遇到了arm64位丢失的错误,因为从2015
。– zeeawan

45

我遇到了实现相同/相似的问题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
是的,值得一提的是,如果您缺少框架,则会抛出此错误。一个线索是您尝试删除体系结构,而下一个/剩余的体系结构也会失败...
Kristen Waite 2015年

1
做得好。从以下引用的“ _OBJC_CLASS _ $ _ XXXXXClass”,添加xxx框架。
iHTCboy'9

发现!任何看到带有“ xml”打印内容的人都可以检查一下-在我的情况下,这是“ libxml”框架未链接的结果。
Evusas

修改pod的引入后,发生此错误,并且所有方法均未修复。但是您的方法可以解决问题。注意:无法搜索lib。
恒星李

33

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

文件夹位置:

〜/库/开发人员/ Xcode / DerivedData /

在此处输入图片说明


3
看起来似乎很奇怪,但实际上确实有效。谢了哥们。
费利佩2016年

2
手动删除派生数据,也对我有用。干杯!
L_Sonic

7
谢谢!我想添加一个提示:该文件夹位于/ User /您的名字/库/ Developer / XCode / DerivedData
Stefano Buora

您还应该能够使用终端删除派生数据:rm -rf〜/ Library / Developer / Xcode / DerivedData
simon_smiley

节省了我的时间... XDDD
萧婷

25

架构ARMv7的 armv7s构建有源体系只有NO,在项目的每个目标,包括每一个豆荚


正常工作...现在,我收到“无效的位码签名”错误。
JeremyF '18

18

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

目标会员


Xcode 9不会自动应用此功能,即使选中该复选框也是如此。谢谢。
阿姆罗·沙菲

那就是问题所在。谢谢
伊格纳西奥·埃尔南德斯

11

这里有一些解释为什么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


那真是令人难以置信的FUBARed!XCode的输出取决于您连接到构建机器的设备!
马特



4

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


试图添加Tesseract框架,只有这对我有所帮助,谢谢。!
HelloimDarius

3

我通过将有效的拱门设置为armv7 armv7s并将发布时仅将构建活动架构设置为YES来解决此问题,然后从命令行进行新的“ pod安装”


3

鉴于iPhone 5s尚未接收到第三方库的64位版本,我不得不使用最新的Xcode(在5.1之前没有抱怨)回到32位模式。

我通过从“有效体系结构”列表中删除arm64,然后将“仅构建活动体系结构”设置为“否”来解决此问题。在我看来,这比上述其他方法更有意义。我正在发布,以防其他人无法获得上述任何解决方案来为他们工作。


3

升级到Xcode 5.1后,我遇到了同样的问题,并通过将Architectures设置为armv7 armv7s进行了修复


3

一整天都被卡在这个问题上。

我有多个Scheme,对于Demo,Internal,Release,它可以很好地进行编译-但是,Debug方案不能编译,并且抱怨libPods.a丢失。

解决方案是转到“项目”->“目标”->“构建设置”,然后将“仅构建活动体系结构”更改为“是”。清洁并建造!最后几个小时的头痒解决了!


与您的问题不完全相同,但相似。我用您提供的相同方法解决了它。
Helzgate 2015年


2

这为我工作:

iOS SDK 9.3

进入app.xcodeproj的构建设置中的 有效体系结构:armv7 armv7s构建活动体系结构:否

清理并构建,为我工作。


1

以下内容对我有用,它可以在64位模拟器和视网膜iPad Mini的Xcode 5.1上获得GPUImage编译而没有错误,而无需从有效架构列表中删除arm64(这违背了拥有用于测试的64位设备的目的64位性能)。

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

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

如果由于要为iOS进行编译而不需要Mac文件,则可以在将文件复制到项目中之前删除Mac文件夹,或者直接从Xcode中删除组。

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

#import "Source/GPUImage.h" 

需要指出的几点:

  • 如果出现错误消息“找不到可可”,则说明已将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下载了框架),因此它可能不是使用GPUImage的正确方法布拉德·拉森(Brad Larson)想要的,但是它适用于我当前的SpriteKit项目。
  • 无需链接到框架/库等,只需如上所述导入标头和实现源文件夹

希望以上内容对您有所帮助-尽管多次询问该问题,但似乎仍然没有明确的说明,但不要担心,GPUImage绝对适用于arm64架构!


1

通过Podfile和安装Pod后,对我来说出现了这个问题pod install。在尝试了许多不同的修复程序之后,我终于手动导入了Pod(将必要的文件拖到我的项目中),这解决了问题。


这对我也有用,但它是一个只有一个文件的简单吊舱。
iluvatar_GR

1

morisunshine答案指向正确的方向时,他的答案做了一些微调就解决了我在iOS8.2上遇到的问题。感谢他。

我通过设置以下方法解决了这个问题:

ARCHS = armv7

VALID_ARCHS = armv6 armv7 armv7s arm64

BUILD ACTIVE ARCHITECTURE ONLY= NO

1
  1. 转到目标构建设置。
  2. 对于调试和发行版,仅将BUILD ACTIVE ARCHITECTURE设置为= NO
  3. 构建并运行

3
PODS项目中还将
Elad


1

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

您可以尝试在下面添加opencv pod文本,如果使用过的话,可以删除离线opencv框架。

pod'OpenCV','2.4.9'


1

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

砰! 有用!



1

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

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

解决此错误的方法:

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



0

在安装AWS框架以解决此问题后,我遇到了同样的问题,我已经从安装AWS POD之后创建的项目中更新了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)   

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


0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.