找不到体系结构i386的符号


113

尝试使用Xcode进行编译时,出现以下错误:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

不知道这意味着什么。

Answers:



92

如果您突然发现这种情况,则通常意味着项目缺少所需的某些框架。库和相关项目可能需要框架,因此,如果您最近添加了一个框架,则可能导致此错误。

要添加框架,请在项目视图中右键单击项目名称,选择Add,然后Existing frameworks...从列表中选择。然后找到缺少符号的框架。

至于您如何找到所需的框架,尽管您也可以使用Xcode帮助搜索,但我发现使用google最简单。搜索其中一个符号,尽最大努力找出正确的名称(例如SCNetworkReachabilityGetFlags),然后在developer.apple.com上找到的第一个文档链接通常是正确的。您通常不必狩猎很远。在这种情况下,就是以下页面:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

然后,在页面顶部,SystemConfiguration在这种情况下,它会告诉您要使用的框架。因此,将其添加到项目中,然后再次编译。

然后继续这样做直到它起作用...

编辑:我从未使用过模拟器,但这是您在设备上执行的操作-我认为它是相同的...


64

有时,目标中缺少源文件。

  1. 检查哪些符号丢失
  2. 目标->构建阶段->编译源
  3. 如果未列出缺少的源文件,请添加
  4. Command + B带来幸福

您可以选择似乎“丢失”的文件,然后在右侧实用工具栏中检查已为要构建的目标选择了其复选框。


1
当不干净地合并两个项目文件而目标成员资格丢失时,通常会发生这种情况。
Steven Hepting 2012年

1
非常感谢,xcode某种程度上没有将所需的.m文件添加到构建阶段!
dreampowder 2012年

1
谢谢:)将2个文件添加到项目中,只有在执行了这些步骤之后,一切都OK
user1105951 2013年

32

我使用以下方法(针对XCode 4)解决了该问题:

1)在项目导航窗口中选择项目,该项目将在右侧显示项目摘要

2)选择第4个标签构建阶段

3)选择使用库链接二进制文件选项

4)添加要获取的框架

5)将框架从主文件夹移动到frameworks文件夹

6)重新构建它,错误消失了。


谢谢。我在搜索MFMailCompose中找到了这个答案,并通过添加MessageUI.framework
Frank Yin

17

问题是应用程序目标缺少所添加文件的目标成员资格。因此,选择文件并将复选标记添加到目标成员资格框中

例如,如果common.m中的方法定义中显示的错误在此处输入图片说明


我遇到了“找不到符号”错误,但情况要简单得多。我向一个方案中添加了一个具有新功能的新模块(文件)。几周后,当我建立一个不同的方案时,没有找到对该函数的调用。只需要将其添加到目标即可。
2016年

17

在花了几个小时处理相同的错误后,想到添加我的解决方案:(

上面的家伙是正确的,您应该检查的第一件事是您是否错过添加任何框架,请参阅上面的Pruthvid提供的步骤。

事实证明,我的问题是我删除了某个编译类后,后来又将其重新添加了,因此缺少一个编译类。

如图所示,检查“编译源”中报告的错误类别。添加您创建的所有缺少的类。


2
谢谢...这对我有用。我正在鼓励一个习俗课。复制了两个自定义类。h和.m进入项目。对它进行了#import操作,仍然出现错误。将自定义类的.m添加到“编译源”部分中,即可解决问题!
GeneCode 2012年

太棒了!我遇到了与Rocotilos相同的问题,我导入了一个自定义类,并导入了它,但是仍然有问题。这成功了!非常感谢!
Souleiman 2012年

8

如果不只是添加缺失的框架,请确保缺失的框架实际上列在“目标/构建阶段/带有库的链接二进制文件”下。如前所述,它通常表示缺少框架。

在我的项目中列出了两个相同的框架,当我删除其中一个时,我遇到了这个错误,因为它也从“使用库链接二进制文件”列表中删除了它。我又添加回来,问题消失了(并且我仍然列出了两个框架)


6

通过更改“ 构建设置”>所有体系结构”,我在项目上修复了类似的错误目标,我。

问题: 当我从Xcode 4.4升级到Xcode 4.5时,我的项目在模拟器上仍然可以正常编译,但不能在设备上编译。在设备上,它引发了错误“体系结构armv7找不到符号”,以及误导性的“ Apple Mach-O链接器错误”和“铛:错误:链接器命令失败,退出代码为1(使用-v查看调用) )。”

原因(以我为例): 我的项目有多个目标,即使将主要目标的“构建设置”>“体系结构” 设置为包括armv7s体系结构,主要目标也依赖于另一个目标(在“构建阶段”>“依赖关系”下列出),并且我没有想到要为其他目标重置“构建设置”>“体系结构”,因此我不得不更改它以包括armv7s。我想模拟器和设备运行在不同的体系结构上,这就是为什么模拟器运行正常但设备运行不正常的原因。


5

您的项目是否依赖于另一个项目,并且该项目中的目标是否设置为主要目标的直接依赖项?如果是这种情况,并且未设置依赖项,则可能未针对所有配置构建依赖目标(即模拟器)

只是一个疯狂的猜测。


4

可能导致此问题的另一种情况是您的代码是否调用C ++或被C ++代码调用。从Obj-C调用时,我自己的.c文件的实用程序功能出现问题,显示为“找不到符号”。解决方法是更改​​文件类型:在Xcode 4中,使用扩展信息窗格将文件类型设置为“ Objective-C ++ Source”;在Xcode 3中,使用“获取信息”将文件类型更改为“ source.cpp.objcpp”。


4

就我而言,所有发布的解决方案均无效。我必须删除该项目,并从SVN服务器进行全新签出。幸运的是,该项目托管在版本控制系统中。不知道我该怎么办。


2

在使用定义的模板化类的C ++项目中,当收到相同的错误时,我在项目导航器中选择了带有定义的模板化类的.cpp文件,然后选择“删除”>“删除引用”。同样,尽管仍在项目中引用了相关的.h文件,但也需要对.cpp包含#include语句,如下所示:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

如果您想看看,github上有一个简单的项目示例

这有点间接欺骗,我不记得这种解决方法的原始来源。


2

如果此错误突然出现,则表示该项目缺少某些框架。库和相关项目可能需要框架,因此,如果您最近添加了一个框架,则可能导致此错误。

要添加框架,请在项目视图中右键单击项目名称,选择“添加”,然后从列表中选择“现有框架”。然后找到缺少符号的框架。

另一件事是,如果您在已编译的资源中添加了任何类,并从项目中删除了这些类,则会出现错误。最好的办法是从已从项目中删除的编译资源(构建设置->编译源代码)中删除类。

就我而言,我在项目中添加了admob类并编译了该项目。在以后的情况下,我不想在我的项目中包含admob,因此我从项目中删除了admob类的引用。发生此错误时,我从编译资源中删除了admob的.m类,从而解决了此问题。


2

尝试通过PSPDFKIT复制时发生了这种情况演示库到我的项目时,。我遵循了网站上的所有说明+此页面上的所有建议。。由于某种原因,它始终显示上述错误,问题是,如果我在错误方法中添加了该消息,那么它只会出现在二进制文件中(显然,我无权访问源代码b / c(我必须为此付费)。

我在说明页面中注意到了这一点:

在此处输入图片说明

所以我去了那个配置文件的胆量,发现了这一点:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

然后,我进入了由该库的作者提供的示例项目。.,并注意到先前的标记在我的构建设置中逐字复制到了其他链接器标记..但是在我的项目中,它们不是!..所以我只是简单地将它们复制并粘贴到我的项目的构建设置中(其他链接器标志),并且一切正常!

要点:如果您在安装程序上依赖某些.xcconfig文件,请仔细检查示例代码源或其他内容,并确保它已被实际应用。


0

发生这种情况的另一个原因是当您升级SDK时。

如果仅删除组,然后将新文件夹拖放到项目中,则“库搜索路径”将同时具有两个SDK。要解决此问题,只需删除旧的SDK路径。


0

我曾经使用过CLGeocoder,但未添加Core.Location框架。基本上,该错误可能意味着多种情况。我希望这可以帮助其他人。


0

在意识到我添加了仅数据的@interface并忘记添加空的@implementation块之前,我对此感到很困惑。


0

在Xcode 11中遇到了此问题,修复程序是将最低部署目标从10.0更改为11.0,希望这对某人有所帮助:)

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.