体系结构i386的未定义符号:_OBJC_CLASS _ $ _ SKPSMTPMessage“,引用自:错误


236

我已经导入了用于在后台从应用程序发送电子邮件的框架,即SKPSMTPMessageFramework。有人可以建议为什么显示以下错误

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

框架来源:

锁定MFMailComposeViewController中的字段

更新

答:只需将文件夹拖放到项目上,然后单击复制。多数民众赞成在选中项目复选框和目标复选框。


构建阶段添加SystemConfiguration.framework后,我的项目编译良好
swiftBoy 2013年

我解决了这个问题。我已将require框架添加到Link Binary with Libraries中。
米希尔·奥扎

Answers:


569

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

去做这个:

TargetSettings->构建阶段->编译源->添加您的.m类-> Build and Run


49
有时会出现这些错误,因为某些框架未正确链接。只需在项目的构建阶段选项卡的“将二进制文件与库链接”中检查所有框架即可。
Heitara

.c文件(也可能是.mm)也可能发生这种情况。
布罗德尼2012年

Rajneesh,您解决了这个问题吗?如果是,您如何解决?
codematrix

9
值得注意的是,您可以选择.m文件,然后在右侧面板的“目标成员身份”部分中选中目标旁边的框。当您向项目中添加文件时,系统会询问您是否要“添加到目标:”,您可能会说“不”,但是您可以随时按照我所说的进行添加。
Nicolas S

4
我以前也遇到过同样的错误,我的解决方案是:构建设置 -> 链接 -> 其他链接器标志 -> -lLibraryName_$(PLATFORM_NAME)d调试添加,并-lLibraryName_$(PLATFORM_NAME)发布
George

37

对我来说,这个问题原来是缺少框架。一旦添加了em,它就会起作用。


这似乎是一个长镜头,因为它与我收到的错误消息并不完全匹配,但是添加了SocketRocket网站上建议的依赖框架也为我修复了该错误消息。
专利

即使您通过cocoapods添加框架,也会发生这种情况。我也必须手动将其添加为框架。谢谢!
FBente '16

我添加的框架在构建之前需要添加其他框架。如果要添加框架,请检查以确保添加了它可能需要的任何框架
Dave Patrick

29

检查“仅有效体系结构和仅构建活动体系结构”属性。

在此处输入图片说明


1
你能告诉我如何在Xcode 4.2,打开此选项窗口
阿南德

如果这没有帮助,请参阅下面的艾伦·派克(Allen Pike)的答案。
MattyG 2012年

这个答案和艾伦的答案都帮助了我。我真的必须检查这两个方面:仅编译源代码和构建Active Architecture。非常感谢你们!
2012年

@Anand它们位于目标的“构建设置”中。
lifelogger 2013年

18

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

在此处输入图片说明


10

您的框架是为armv(x)编译的吗?在我看来,它似乎是为i386编译的,其代码无法在iOS设备上运行。否则,它将针对armv(x)进行编译,而您正在尝试在模拟器上运行它,这是i386代码。使用上面显示的构建设置Akshay,确保为要在其上运行的芯片正确编译了框架。


它的排序。我只需要将框架forlder拖放到xCode中的我的项目forlder中。谢谢

是否有可能以某种方式编译可同时在iOS设备和模拟器上运行的框架?还是我应该总是只选择一个选项?
Aleksey Tsyss '17

您是在谈论打开同一个项目的两个窗口,并设置一个在模拟器上运行,另一个在设备上运行?
Owen Hartnett

7

如果您在xcode中导入其他项目,并且当前和导入项目在Compiler源代码中都具有相同的文件,则只需在“构建阶段”设置中删除当前项目中的相同文件即可。


4

是的,这与艾伦所说的有关...在源文件的“实用工具”部分中查找TargetMembership。有一个复选框将该文件与项目关联。对此进行检查也为我解决了这个问题。


我修改了所有其他设置,但这是最终为我修复的设置。谢谢!
亚历克·托马斯


4

当我两次打开同一个项目时遇到了这个问题,只有一个项目是原始项目,而另一个项目是从git url克隆的。

“产品”>“清洁”解决了该问题。


4

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

在此处输入图片说明


4

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

体系结构i386的未定义符号:

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

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


@JayprakashDubey请问Mitch
D_D 2015年

4

最后试试这个:

因此,我尝试了此页面上的所有建议。.全部无效。.我的问题开始的方式是按照教程中教如何链接静态库的步骤进行。在我的示例项目中,说明工作正常。.但是随后在我的实际项目中,我开始遇到上述错误。

所以我所做的就是遍历该教程的每一步,并在每一步之后构建.. 令人反感的结果是:添加-all_load来构建设置->其他链接器标志

事实证明,曾经建议使用此标志将类别链接到静态库..但是后来证明,此标志不再是Xcode 4.2 + ..((-force_load标志也是如此)。在其他帖子中推荐)。


3

当我遇到相同的问题时,我忘记添加“库的编译版本(扩展名为.a)”。通常,我们在构建阶段的“目标依赖关系”中添加了导入项目的库,但是在构建阶段我们忘记在“链接二进制文件”和“库”中添加“已编译的库”。


3

如果其他人有相同的问题,请添加对我有用的内容,然后在这里结束。我有一个较旧的项目,其CLANG_ENABLE_MODULES设置设置为“否”。经过数小时的挫败,我与一个正在工作的项目进行了比较,发现在我的LLVM构建设置下,“启用模块”设置为“否”。将此设置为“是”解决了我的问题,该应用程序正常运行。

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


很棒的修复!这对我很有帮助!我有一个旧的Pod项目,每次添加一个新Pod都会发生此错误。谢谢!!!
DiscDev 2014年

2

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

原始项目的“其他链接器”标志中有“ ObjC -all_load”,当我附加“ -all_load -lstdc ++”时,我收到了本贴子有关的错误消息。当我删除“ ObjC -all_load”并仅添加“ -all_load -lstdc ++”时,项目已构建,但仍然没有猴子对话注销作为控制台中的确认内容


2

您可能使用的是仅针对REAL硬件编译的库。例如,如果您使用的是Zephyr HxM Smart之类的蓝牙库,则它可能不会在模拟器上编译,而只能在真实设备上运行。


1

遇到了与IOS 6类似的问题。通过在构建阶段部分中将storekit.framework添加到“使用库链接二进制文件”,可以解决此问题。

现在,它就像一种魅力。


1

当我添加PSTCollectionviewcontroller时,我有7个错误的相同问题。此问题的一种解决方案是检查您的“ xcode->构建阶段->编译源代码”,在此添加所有“ .m”文件..希望您这样做帖子将对以后的用户有所帮助。


1

在我的矿场上,我正在使用Cocoapods进行增强现实项目,结果发现,当您实现cocoapods并打开项目的.workspace时,最终得到的是Xcode Project目标,而那些Pod目标则是在同一文件中实现的。发生的事情是两个.m都被两个人使用。在构建阶段>>编译源中删除了Xcode目标的重复项后,它运行良好。


1

在尝试升级到新的Google Analytics(分析)库时,我发现了此高度误导性消息。

就我而言,问题在于该库有两个冲突的副本。它们位于不同的文件夹中,但都在我的应用程序的库构建路径(在“构建设置”下)中列出。

将所有不赞成使用的库文件移出该文件夹最终解决了这个问题,并且使神秘的错误消息消失了。




1

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

生成设置中 >>将“ 仅生成活动体系结构从“否”更改为“ 是”

它为我工作。希望它对其他人也有帮助。

在此处输入图片说明


“从否到是”更容易理解。无论如何,这行得通。
维克多·拉尔特

0

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


0

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


0

我在NSManagedObject中遇到了类似的错误,这是因为我使用的是Core Data,但是在构建阶段-链接二进制与库中缺少Core Data框架,正如其他人回答的那样


欢迎来到SO Sam。回答问题时,请尝试添加其他答案中不存在的新见解,研究或代码。如果您只是想分享另一个答案对您有用,请尝试对他们的答案进行投票或评论,而不要发布重复的答案。
布奇

0

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

您需要查看新添加的库的.h和.m文件,并查看其需要哪些框架,然后将这些框架包括在项目中(“目标”>“构建阶段”>“使用库链接二进制文件”)。


0

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


0

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

在您构建应用程序之前,该应用程序不会显示任何错误,它将在编译阶段以.o文件形式抛出错误。

记住要删除任何正在调用已删除文件的MACRO。

谢谢 :)


0

除了Allan所做的事情之外,我还添加了缺少的类,我遵循@ emdog4的解决方案,并通过转到Xcode中的Build Phases并在“ Link Binary with Libraries”下单击+,然后选择“ CoreData.framework”,添加了Core Data库。 。这解决了我的错误

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.