架构i386的未定义符号:_OBJC_CLASS _ $ _ SKPSMTPMessage“,引用自:error

时间:2011-08-08 15:17:40

标签: ios objective-c iphone compiler-errors email-integration

我已导入用于从后台应用程序发送电子邮件的框架,即SKPSMTPMessage框架。有人可以建议为什么会出现以下错误

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

采取框架的来源: -

Locking the Fields in MFMailComposeViewController

更新

答案:只需将文件夹拖放到项目上,然后点击复制即可。 多数民众赞成也选择项目复选框和目标复选框。

34 个答案:

答案 0 :(得分:566)

如果您的类'.m文件未列在目标“构建阶段”选项卡的“编译源”步骤下,则可能会出现此类错误。通常Xcode会为您执行此操作,但有时会丢失绘图,您需要手动添加.m文件。

要做到这一点:

TargetSettings - >构建阶段 - >编译源 - >添加.m类 - >构建并运行

答案 1 :(得分:37)

对我来说,问题结果是缺少框架。一旦我添加了em,它就有效了。

答案 2 :(得分:28)

检查有效架构&仅构建Active Architecture属性。

enter image description here

答案 3 :(得分:17)

如果您使用的是cocoapods,请确保您的目标的构建设置在其他链接器标记部分中包含 $(继承)

enter image description here

答案 4 :(得分:10)

您的框架是否为armv(x)编译?它看起来像是为i386编译的,这些代码不能在iOS设备上运行。或者它是为armv(x)编译的,你试图在模拟器上运行它,这是i386代码。使用上面显示的构建设置Akshay确保您的框架已正确编译为您要运行它的芯片。

答案 5 :(得分:7)

如果您在xcode中导入其他项目,并且当前和导入项目在编译器源中都有相同的文件,那么只需在“构建阶段”设置中删除当前项目中的相同文件。它对我有用。

答案 6 :(得分:4)

是的,这与allen所说的有关...在源文件的Utilities部分查找TargetMembership。有一个复选框将该文件与项目相关联。检查这个也解决了这个问题。

答案 7 :(得分:4)

也可能是你错过了链接二进制库,检查Targes中的Build Phases添加所需的库然后 产品>清洁 产品>构建

这也必须奏效!

答案 8 :(得分:4)

最后一次尝试:

所以我尝试了这个页面上的所有建议..没有工作..我的问题开始的方式是遵循this教程中教导如何链接静态库的步骤。使用我的示例项目,说明工作正常..但在我的实际项目中,我开始得到上面的错误。

所以我所做的是完成所述tutorial的每一步,并在每一步之后构建。违规行竟然是这一行: 添加-all_load来构建设置 - >其他链接器标志

事实证明,这个标志曾经recommended一次将类别链接到静态库..但后来它turned out不再需要这个标志Xcode 4.2+ ..(同样如此对于-force_load标志..这也是在其他posts中建议的)..

答案 9 :(得分:4)

当我遇到与此相同的问题时:

  

架构i386的未定义符号:

     

_OBJC_CLASS _ $ _ SKPSMTPMessage,引自:ConfirmController.o中的objc-class-ref

原来我忘了添加框架。确切地说是QuartzCore.framework。

答案 10 :(得分:4)

我也遇到了这个问题,我通过检查编译源和链接二进制文件是否包含我需要的所有文件/库/框架来修复它。

enter image description here

答案 11 :(得分:3)

当我遇到同样的问题时,我忘了添加“编译版本的库(带扩展名.a)”。通常我们在Build Phases中的Target Dependency中添加导入项目的库,但是我们忘记在Link Binary中将“编译库”添加到Build Phase中的Libraries。

答案 12 :(得分:3)

添加对我有用的东西,以防其他人遇到同样的问题并最终在这里结束。我有一个较旧的项目,其CLANG_ENABLE_MODULES设置为No。经过数小时的挫折后,我与一个正在运行的项目相比,发现我在我的LLVM构建设置下启用了模块设置为no。将此设置为“是”解决了我的问题,应用程序构建正常。

项目设置 - >构建设置 - >搜索“模块”和更新启用模块(C和Objective-C)为YES。

答案 13 :(得分:2)

我没有在构建设置中将“-all_load -lstdc ++”添加到其他链接器标志中,我能够无错误地启动SIM卡但是在启动时我没有获得MonkeyTalk日志输出,而且我之前写的脚本是用于连接现在显示播放按钮为禁用。 MT IDE的输出显示为“连接设置为iOS模拟器”,但无法选择运行/播放按钮。

原始项目在其他链接器标志中有“ObjC -all_load”,当我附加“-all_load -lddc ++”时,我收到了这篇文章的错误消息。当我删除了“ObjC -all_load”并且只添加了“-all_load -lstdc ++”项目构建,但仍然没有在控制台中将确认的猴子通话输出

答案 14 :(得分:2)

您可能正在使用仅为REAL硬件编译的库。例如,如果你使用像Zephyr HxM Smart这样的蓝牙库,它可能无法在模拟器上编译,只能在真实设备上运行。

答案 15 :(得分:1)

当我添加PSTCollectionviewcontroller时,我遇到了同样的问题。这个问题的一个解决方案是检查你的“xcode - >构建阶段 - >编译源代码”这里添加你的所有“.m”文件。我希望你这篇文章将来会帮助用户。

答案 16 :(得分:1)

与IOS 6陷入类似的问题。 能够通过在构建阶段部分中将storekit.framework添加到“Link Binary with Libraries”来解决它。

现在,它就像一个魅力。

答案 17 :(得分:1)

在我看来,我正在使用Cocoapods进行增强现实项目,我发现当你实现cocoapods并打开你的项目的.workspace时,你最终得到了Xcode Project目标以及那些在你内部实现的目标文件。发生的事情是,两者都使用了一些.m。在Build Phases>>中删除了Xcode目标的重复序列之后Compile Sources,它工作得很好。

答案 18 :(得分:1)

产品=>清洁为我做了诀窍

答案 19 :(得分:1)

更改活动体系结构对我有用,我的一个库正在使用i386。

构建设置 >>中,将仅构建活动体系结构从否更改为

对我有用。希望它对其他人也有帮助。

enter image description here

答案 20 :(得分:1)

我在尝试升级到新的Google Analytics库时发现了这个极具误导性的消息。

在我的情况下,问题是库的两个冲突副本。它们位于不同的文件夹中,但都列在我的应用程序库构建路径中(在构建设置下)。

将所有已弃用的库文件移出文件夹,最终完成了这一操作,并使神秘的错误消息消失。

答案 21 :(得分:1)

检查是否在构建阶段复制了所有捆绑资源。

答案 22 :(得分:0)

只需启用“仅构建活动架构”选项

在PROJECT >>构建设置>>仅构建Active Architecture >>是

screenshot of the path to the configuration

记住要检查每个目标中是否也启用了它们

答案 23 :(得分:0)

上述答案都没有解决我的问题。当我将Xcode升级到8后,我得到了同样的错误,我去了目标 - > 构建阶段 - > 链接二进制文件库并删除导致问题的框架并重新添加它,所有错误都消失了。希望这会有助于他人。 enter image description here

答案 24 :(得分:0)

在我的情况下,pod更新没有以某种方式更新项目。所以我必须自己做,将MBProgressHud添加到OtherLinkerFlags。

enter image description here

答案 25 :(得分:0)

我遇到了同样的问题。我添加了构建阶段所需的2个框架。 希望这有帮助! symbol(s) not found for architecture i386

答案 26 :(得分:0)

在我的情况下,它有点不同

在前缀标题中缺少定义

#ifdef DEBUG
#   define TWDLog(fmt, ...) NSLog((@"\n%s\n" fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#   define TWDLog(...)
#endif

因此,搜索PROJECTNAME-Prefix.pch并检查两个项目中是否缺少某些内容

答案 27 :(得分:0)

除了Allan所做的,添加了缺少的课程,我遵循了@ emdog4的解决方案,并通过在Xcode中的Build Phases和在Libraries'的链接二进制文件下添加了核心数据库。点击+并选择' CoreData.framework'。这解决了我的错误

答案 28 :(得分:0)

请记住,您可以在任何调用已删除文件的视图控制器中放置一些宏。

在您构建应用程序之前,应用程序不会显示任何错误,它会在.o文件的编译阶段引发错误。

请记住删除任何调用您已删除文件的MACRO。

谢谢:)

答案 29 :(得分:0)

尝试删除框架,清理项目,添加回来并编译。 要么 删除xcode在编译源,清理项目中添加的类,然后将其添加回构建。

答案 30 :(得分:0)

如果在项目中添加需要项目中未包含的原生框架的第三方库,则会出现此类错误。

您需要查看新添加的库的.h和.m文件并查看它所需的框架,然后在项目中包含这些框架(目标>构建阶段>链接二进制文件库)。

答案 31 :(得分:0)

我与NSManagedObject有类似的错误,这是因为我使用的是核心数据,但在构建阶段 - 链接二进制文件库中缺少核心数据框架,正如其他人已经回答的那样

答案 32 :(得分:0)

当我从另一个项目中拖放一些源文件时,我收到了此消息。当我删除它们然后通过“文件”菜单中的“添加文件...”添加它们时,它构建时没有错误。

答案 33 :(得分:0)

答案是,您只需将文件夹拖放到项目上,然后单击“复制”即可。