【问题标题】:symbol(s) not found for architecture i386未找到体系结构 i386 的符号
【发布时间】:2011-06-17 22:05:11
【问题描述】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      有时您的目标中缺少源文件。

      1. 检查缺少哪些符号
      2. 目标->构建阶段->编译源代码
      3. 如果缺少的源文件未列出,请添加它们
      4. command+b 表示幸福

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

      【讨论】:

      • 这种情况经常发生在两个项目文件合并不干净导致目标成员丢失时。
      • 非常感谢,不知何故 xcode 没有将所需的 .m 文件添加到构建阶段!
      • 谢谢 :) 将 2 个文件添加到项目中,只有在完成这些步骤后一切正常
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        3) 选择 Link binary with library 选项

        4) 添加您正在获取的框架

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

        6) 再次构建它,错误就消失了。

        【讨论】:

        • 谢谢。我在搜索 MFMailCompose 时找到了这个答案,并通过添加 MessageUI.framework 解决了
        【解决方案5】:

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

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

        【讨论】:

        • 我得到了这个 Symbol Not Found 错误,但情况要简单得多。我添加了一个新模块(文件),其中包含我的一个方案所需的一个新功能。几周后,当我构建了一个不同的方案时,没有找到对该函数的调用。只需将其添加到目标中即可。
        【解决方案6】:

        在同一错误上花费了几个小时后,我想为此添加我的解决方案:(

        上面的人说得对,首先你应该检查的是你是否错过了添加任何框架,请参阅上面 Pruthvid 提供的步骤。

        我的问题,原来是我删除后缺少一个编译类,后来又重新添加了它。

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

        【讨论】:

        • 谢谢...这对我有用。我正在实施一个自定义课程。复制了两个自定义类。 h 和 .m 进入项目。对其进行了#import,仍然出现错误。将自定义类的 .m 添加到“编译源”部分解决了它!
        • 太棒了!我和 Rocotilos 有同样的问题,我导入了一个自定义类,导入了,但仍然有问题。这成功了!非常感谢!
        【解决方案7】:

        确保缺少的框架实际上列在“Target/Build Phases/Link Binary With Libraries”下,如果不只是添加它。如前所述,它通常表示缺少框架。

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

        【讨论】:

          【解决方案8】:

          我通过更改 ALL 目标的 Build Settings > Architectures 修复了我的项目中的类似错误。

          问题: 当我从 Xcode 4.4 升级到 Xcode 4.5 时,我的项目在模拟器上仍然可以正常编译,但不能在设备上编译。在设备上,它抛出错误 “symbol(s) not found for architecture armv7s” 以及误导性的“Apple Mach-O Linker Error”和“clang: error: linker command failed with exit code 1” (使用 -v 查看调用)。”

          原因(以我为例): 我的项目有多个目标,尽管 main target 的 Build Settings > Architectures 设置为包含 armv7s 架构,但主要目标依赖于另一个目标(在 Build Phases > Dependencies 下列出),而我没想到为其他目标重置构建设置>架构,我不得不将其更改为包括 armv7s。 我想模拟器和设备在不同的架构上运行,这就是为什么模拟器可以,而设备却不行。

          【讨论】:

            【解决方案9】:

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

            只是一个疯狂的猜测。

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

                就我而言,已发布的解决方案均无效。 我不得不删除项目并从 SVN 服务器重新结帐。幸运的是,该项目托管在版本控制系统中。不知道我会怎么做。

                【讨论】:

                  【解决方案12】:

                  在使用定义的 模板化 类的 C++ 项目中,虽然收到相同的错误,但我在项目导航器中选择了具有定义的 模板化 类的 .cpp 文件,然后删除> 删除参考。此外,相关的 .h 文件虽然仍然在项目中被引用,但需要对 .cpp 有一个 #include 语句,如下所示:

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

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

                  这有点间接技巧,我不记得这个解决方法的原始来源。

                  【讨论】:

                    【解决方案13】:

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

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

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

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

                    【讨论】:

                      【解决方案14】:

                      这发生在我尝试将PSPDFKIT 演示库复制到我的项目中时。我遵循了网站上的所有说明+此页面上的所有建议..出于某种原因,它不断给出上述错误,问题是如果我在错误方法中对消息进行了grep..它只出现在二进制文件中(显然我无法访问源代码 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 文件,请仔细检查示例代码源或其他内容,并确保它已实际应用......在我的情况下它没有正确应用

                      【讨论】:

                        【解决方案15】:

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

                        如果您只是删除组,然后将新文件夹拖放到项目中,“库搜索路径”将包含两个 SDK。要解决,只需删除旧的 SDK 路径即可。

                        【讨论】:

                          【解决方案16】:

                          我使用了 CLGeocoder,但没有添加 Core.Location 框架。基本上,此错误可能意味着多种情况。我希望这对其他人有帮助。

                          【讨论】:

                            【解决方案17】:

                            我之前被这个难住了,才意识到我添加了一个纯数据@interface 并忘记添加空的@implementation 块。

                            【讨论】:

                              【解决方案18】:

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

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2011-09-16
                                • 1970-01-01
                                • 2012-07-18
                                相关资源
                                最近更新 更多