找不到架构i386的符号

问题描述 投票:110回答:17

当尝试使用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**

不确定这意味着什么。

objective-c ios xcode4
17个回答
49
投票

您正在使用ASIHTTPRequest,因此您需要设置项目。在这里阅读第二部分

https://allseeing-i.com/ASIHTTPRequest/Setup-instructions


3
投票

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


3
投票

就我而言,所发布的解决方案都没有奏效。我不得不删除项目并从SVN服务器进行新的结账。幸运的是,该项目是在版本控制系统中托管的。不知道我会做什么。


1
投票

在使用定义的模板化类的C ++项目中,在接收相同错误的同时,我在Project Navigator中选择了带有定义的模板化类的.cpp文件,然后选择Delete> Remove Reference。此外,关联的.h文件虽然仍在项目中引用,但需要对.cpp具有#include语句,如下所示:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

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

如果你想看,一个简单的项目例子是on github

这是一个间接的诡计,我不记得这个解决方法的原始来源。


1
投票

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

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

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

在我的例子中,我在项目中添加了admob类并编译了项目。在后来的情况下,我不想在我的项目中包含admobs,所以我从我的项目中删除了admob类的引用。当这个错误发生时我从编译资源中删除了我的admob的.m类解决了这个问题。


1
投票

在尝试将PSPDFKIT演示库复制到我的项目中时发生了这种情况。我按照网站上的所有说明+此页面上的所有建议...由于某种原因,它继续给出上述错误,问题是,如果我在错误方法中grepped消息..它只出现在二进制文件中(显然我无法访问源代码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
投票

我在没有添加Core.Location框架的情况下使用了CLGeocoder。基本上这个错误可能意味着多种事情。我希望这有助于其他人。


0
投票

我之前只是意识到我添加了一个仅限数据的@interface而忘记添加空的@implementation块之前我已经被这一个难过了。


91
投票

如果你突然出现这种事情,通常意味着项目缺少它需要的一些框架。库和依赖项目可能需要框架,因此如果您最近添加了一个框架,那么可能会导致此错误。

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

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

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

然后在页面顶部,它告诉你使用哪个框架,在这种情况下使用SystemConfiguration。所以将它添加到项目中,然后再次编译。

然后继续这样做,直到它工作......

编辑:我从未使用过模拟器,但这就是你在设备上所做的事情 - 我认为它是一样的......


63
投票

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

  1. 检查哪些符号缺失
  2. target-> build phases-> compile source
  3. 添加缺少的源文件(如果未列出)
  4. 命令+ b表示幸福

您可以选择似乎“缺失”的文件,并在右侧实用工具栏中检查为您正在构建的目标选择了他们的复选框。


31
投票

我使用以下方法解决了它(对于XCode 4):

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

2)选择第四个选项卡构建阶段

3)选择Link binary with library选项

4)添加你要获得的框架

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

6)再次构建它并且错误消失了。


16
投票

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

例如,如果在common.m中的方法定义中显示错误


16
投票

考虑为此添加我的解决方案,花了几个小时后出现同样的错误:(

上面的人是正确的,你要检查的第一件事是你是否错过了添加任何框架,请参阅上面的Pruthvid提供的步骤。

事实证明,我的问题是在删除它之后缺少一个编译类,后来再次将其添加回来。

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


7
投票

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

在我的项目中,列出了两个相同的框架,当我删除其中一个时,我遇到了这个错误,因为它也从“Link Binary With Libraries”列表中删除了它。我加回来了,问题就消失了(我仍然列出了两个框架)


5
投票

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

问题:当我从Xcode 4.4升级到Xcode 4.5时,我的项目仍然可以在模拟器上编译好但是没有在设备上编译。在设备上,它抛出错误“找不到架构armv7s的符号”,以及误导性的“Apple Mach-O链接器错误”和“clang:错误:链接器命令失败,退出代码1(使用-v查看调用) )“。

原因(在我的情况下):我的项目有多个目标,即使主要目标的构建设置>体系结构设置为包含armv7s体系结构,主要目标依赖于另一个目标(在Build Phases> Dependencies下列出),以及我没有想过为其他目标重置Build Settings> Architectures,我不得不改变它以包含armv7s。我想模拟器和设备运行在不同的架构上,这就是为什么模拟器没问题而设备没有。


4
投票

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

只是一个疯狂的猜测。

© www.soinside.com 2019 - 2024. All rights reserved.