ChatGPT解决这个技术问题 Extra ChatGPT

架构 i386 的未定义符号:_OBJC_CLASS_$_SKPSMTPMessage”,引用自:错误

我已经导入了用于在后台从应用程序发送电子邮件的框架,即 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

更新:

答:只需将文件夹拖放到项目上,然后单击复制。那就是选择项目复选框和目标复选框。

从构建阶段添加 SystemConfiguration.framework 后,我的项目编译良好
我解决了这个问题。我已将 require 框架添加到 Link Binary with Libraries。

M
Matthew

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

去做这个:

TargetSettings -> Build Phases -> Compile Sources -> 添加你的 .m 类 -> Build and Run


有时出现这些错误是因为某些框架未正确链接。只需在项目的构建阶段选项卡中检查“Link Binary With Libraries”中的所有框架。
这也可能发生在 .c 文件上,大概也是 .mm 。
Rajneesh,你解决了这个问题吗?如果是,您是如何解决的?
值得注意的是,您可以选择 .m 文件并在右侧面板的“目标成员资格”部分中勾选目标旁边的框。当您将文件添加到项目时,系统会询问您是否要“添加到目标:”,您可能已经拒绝,但您可以随时按照我说的进行添加。
我曾经有同样的错误,我的解决方案是:Build Setting -> 链接 -> 其他链接器标志 ->为 Debug 添加 -lLibraryName_$(PLATFORM_NAME)d,为 Release 添加 -lLibraryName_$(PLATFORM_NAME)
v
verma

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


这似乎是一个很长的镜头,因为它与我收到的错误消息并不真正匹配,但添加 SocketRocket 站点上建议的依赖框架也为我修复了它。
即使您通过 cocoapods 添加框架,也可能发生这种情况。我也必须手动将其添加为框架。谢谢!
我添加的框架需要在构建之前添加其他框架。如果您要添加一个框架,请检查以确保您添加了它可能需要的任何框架
T
Tim Cooper

检查 Valid Architectures & Build Active Architecture only 属性。

https://i.stack.imgur.com/OuWr8.png


你能告诉我如何在 Xcode 4.2 中打开这个选项窗口吗
如果这没有帮助,请参阅下面的 Allen Pike 的回答。
这个答案和艾伦的答案都帮助了我。我真的必须检查两件事:仅编译源代码和构建活动架构。非常感谢你们!
@Anand 他们在目标的构建设置中。
T
Tim

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

https://i.stack.imgur.com/wkiC6.png


O
Owen Hartnett

你的框架是为 armv(x) 编译的吗?在我看来,它是为 i386 编译的,该代码无法在 iOS 设备上运行。或者它是为 armv(x) 编译的,而你试图在模拟器上运行它,这是 i386 代码。确保使用上面显示的构建设置 Akshay,您的框架已针对您要运行它的芯片正确编译。


其排序。我必须将框架 forlder 拖放到 xCode 中的项目 forlder 中。谢谢
是否有可能以某种方式编译一个框架以同时在 iOS 设备和模拟器上运行?还是我应该总是只选择一个选项?
您是在谈论为同一个项目打开两个窗口,并设置一个在模拟器上运行,另一个在设备上运行?
D
DPP

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


y
yeahdixon

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


我修改了所有其他设置,但这是最终为我修复的设置。谢谢!
G
Gabriel Ramirez

也可能是您缺少链接到二进制库,检查构建阶段在您的目标中添加所需的库,然后产品 > 清洁产品 > 构建

那也必须工作!


k
kraftydevil

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

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


y
yujohnnyzhou

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

https://i.stack.imgur.com/OApq4.png


D
DD_

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

架构 i386 的未定义符号:_OBJC_CLASS_$_SKPSMTPMessage,引用自:ConfirmController.o 中的 objc-class-ref

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


@JayprakashDubey 请问米奇
C
Community

最后试试这个:

所以我尝试了此页面上的所有建议.. 没有一个有效.. 我的问题开始的方式是按照this教程中的步骤进行操作,该教程教授如何链接静态库。在我的示例项目中,说明运行良好。但在我的实际项目中,我开始收到上述错误。

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

事实证明,这个标志曾经是 recommended 将类别链接到静态库.. 但后来 turned out 这个标志不再需要 Xcode 4.2+ ..(同样适用于 -force_load 标志..这在其他 posts 中也被推荐)..


B
Balamurugan

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


j
jlichti

添加对我有用的东西,以防其他人遇到同样的问题并最终出现在这里。我有一个较旧的项目,其 CLANG_ENABLE_MODULES 设置设置为 No。经过数小时的挫折后,我与一个工作项目进行了比较,发现我在 LLVM 构建设置下将 Enable Modules Set 设置为 no。将此设置为 Yes 解决了我的问题,并且应用程序构建良好。

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


精彩的修复!这对我帮助很大!我有一个旧的 pods 项目,每次添加新 pod 时都会发生此错误。谢谢!!!
S
Satish Mavani

活动架构的变化对我有用,我的一个库是使用 i386。

在构建设置中 >> 将 Build Active Architecture Only 更改为 Yes 从 NO

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

https://i.stack.imgur.com/vbIIZ.png


“从否到是”更容易理解。不管怎样,这行得通。
L
Laser Hawk

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

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


D
DiscDev

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


b
bkbeachlabs

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

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

将所有已弃用的库文件从文件夹中移出最终起到了作用,并使神秘的错误消息消失了。


T
Troy

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

现在,它就像一个魅力。


N
Naveen

当我添加 PSTCollectionviewcontroller 时,我遇到了同样的问题,有 7 个错误。解决此问题的一种方法是检查您的“xcode --> 构建阶段 --> 编译源”,在此处添加您的所有“.m”文件..我希望你这样做帖子将在未来帮助用户。


J
Joao Paulo

在我的身上,我将 Cocoapods 用于增强现实项目,我发现当你实现 cocoapods 并打开项目的 .workspace 时,你最终会得到 Xcode Project 目标和你在同一个文件中实现的那些 Pods 目标。发生的事情是两者都使用了一些 .m。在 Build Phases >> Compile Sources 中删除了 Xcode 目标的重复项后,它运行良好。


A
Artjom B.

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


Y
YogevSitton

产品 => 清洁对我有用


M
Mann

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


R
RyeMAC3

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


S
Sam

我在使用 NSManagedObject 时遇到了类似的错误,这是因为我使用的是 Core Data,但在 Build Phases - Link Binary With Libraries 中缺少 Core Data 框架,正如其他人回答的那样


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

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

您需要查看新添加的库的 .h 和 .m 文件并查看它需要哪些框架,然后将这些框架包含在您的项目中(Target > Build Phases > Link Binary With Libraries)。


S
Saif

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


A
Atef

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

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

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

谢谢 :)


m
malkoty

除了 Allan 所做的添加缺失的类之外,我还按照 @emdog4 的解决方案添加了 Core Data 库,方法是转到 Xcode 中的 Build Phases 并在“Link Binary with Libraries”下单击 + 并选择“CoreData.framework” .这解决了我的错误


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅