我已经导入了用于在后台从应用程序发送电子邮件的框架,即 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
更新:
答:只需将文件夹拖放到项目上,然后单击复制。那就是选择项目复选框和目标复选框。
如果您的类的 .m 文件未在目标的“构建阶段”选项卡的“编译源”步骤下列出,则可能会出现此类错误。通常 Xcode 会为您执行此操作,但有时它会丢失绘图并且您需要手动添加 .m 文件。
去做这个:
TargetSettings -> Build Phases -> Compile Sources -> 添加你的 .m 类 -> Build and Run
对我来说,问题原来是缺少框架。一旦我添加了它们,它就起作用了。
检查 Valid Architectures & Build Active Architecture only 属性。
https://i.stack.imgur.com/OuWr8.png
如果您使用的是 cocoapods,请确保您的目标的构建设置在其他链接器标志部分包含 $(inherited)
https://i.stack.imgur.com/wkiC6.png
你的框架是为 armv(x) 编译的吗?在我看来,它是为 i386 编译的,该代码无法在 iOS 设备上运行。或者它是为 armv(x) 编译的,而你试图在模拟器上运行它,这是 i386 代码。确保使用上面显示的构建设置 Akshay,您的框架已针对您要运行它的芯片正确编译。
如果您在 xcode 中导入其他项目,并且如果当前项目和导入项目在编译器源中都有相同的文件,那么只需在“构建阶段”设置中删除当前项目中的相同文件。它对我有用。
是的,这与艾伦所说的有关...在源文件的实用程序部分中查找 TargetMembership。有一个复选框将该文件与项目相关联。检查这个也为我解决了这个问题。
也可能是您缺少链接到二进制库,检查构建阶段在您的目标中添加所需的库,然后产品 > 清洁产品 > 构建
那也必须工作!
当我两次打开同一个项目时遇到了这个问题,只有一个项目是原始项目,另一个是从 git url 克隆的。
“产品”>“清洁”解决了这个问题。
我也遇到了这个问题,我通过检查编译源和链接二进制文件是否包含我需要的所有文件/库/框架来修复它。
https://i.stack.imgur.com/OApq4.png
当我遇到与此相同的问题时:
架构 i386 的未定义符号:_OBJC_CLASS_$_SKPSMTPMessage,引用自:ConfirmController.o 中的 objc-class-ref
原来我只是忘了添加框架。准确地说是 QuartzCore.framework。
最后试试这个:
所以我尝试了此页面上的所有建议.. 没有一个有效.. 我的问题开始的方式是按照this教程中的步骤进行操作,该教程教授如何链接静态库。在我的示例项目中,说明运行良好。但在我的实际项目中,我开始收到上述错误。
所以我所做的是完成上述 tutorial 的每一步并在每一步之后构建.. 违规行原来是这一行:添加 -all_load 到构建设置->其他链接器标志
事实证明,这个标志曾经是 recommended 将类别链接到静态库.. 但后来 turned out 这个标志不再需要 Xcode 4.2+ ..(同样适用于 -force_load 标志..这在其他 posts 中也被推荐)..
当我遇到同样的问题时,我忘记添加“库的编译版本(扩展名为.a)”。通常我们在 Build Phases 的 Target Dependency 中添加导入项目的库,但我们忘记在 Link Binary 中添加“编译库”与 Build Phases 中的库。
添加对我有用的东西,以防其他人遇到同样的问题并最终出现在这里。我有一个较旧的项目,其 CLANG_ENABLE_MODULES 设置设置为 No。经过数小时的挫折后,我与一个工作项目进行了比较,发现我在 LLVM 构建设置下将 Enable Modules Set 设置为 no。将此设置为 Yes 解决了我的问题,并且应用程序构建良好。
项目设置 -> 构建设置 -> 搜索“模块”并将启用模块(C 和 Objective-C)更新为“是”。
活动架构的变化对我有用,我的一个库是使用 i386。
在构建设置中 >> 将 Build Active Architecture Only 更改为 Yes 从 NO
它对我有用。希望它对其他人也有帮助。
https://i.stack.imgur.com/vbIIZ.png
我没有在构建设置中将“-all_load -lstdc++”添加到其他链接器标志中,并且我能够毫无错误地启动 sim,但是在启动时我没有得到 MonkeyTalk 日志输出以及我之前编写的用于连接的脚本现在将播放按钮显示为禁用。 MT IDE 的输出显示为“连接设置为 iOS 模拟器”,但无法选择运行/播放按钮。
原始项目在其他链接器标志中有“ObjC -all_load”,当我附加“-all_load -lstdc++”时,我收到了这篇文章的错误消息。当我删除“ObjC -all_load”并仅添加“-all_load -lstdc++”时,项目构建,但仍然没有monkey talk log输出作为控制台中的确认
您可能正在使用仅针对真实硬件编译的库。例如,如果您使用像 Zephyr HxM Smart 这样的蓝牙库,它可能无法在模拟器上编译,只能在真实设备上运行。
我在尝试升级到新的 Google Analytics 库时发现了这个高度误导的消息。
就我而言,问题在于图书馆有两个相互冲突的副本。它们位于不同的文件夹中,但都列在我的应用程序库构建路径中(在构建设置下)。
将所有已弃用的库文件从文件夹中移出最终起到了作用,并使神秘的错误消息消失了。
在 IOS 6 中遇到了类似的问题。能够通过将 storekit.framework 添加到构建阶段部分的“Link Binary with Libraries”来解决它。
现在,它就像一个魅力。
当我添加 PSTCollectionviewcontroller 时,我遇到了同样的问题,有 7 个错误。解决此问题的一种方法是检查您的“xcode --> 构建阶段 --> 编译源”,在此处添加您的所有“.m”文件..我希望你这样做帖子将在未来帮助用户。
在我的身上,我将 Cocoapods 用于增强现实项目,我发现当你实现 cocoapods 并打开项目的 .workspace 时,你最终会得到 Xcode Project 目标和你在同一个文件中实现的那些 Pods 目标。发生的事情是两者都使用了一些 .m。在 Build Phases >> Compile Sources 中删除了 Xcode 目标的重复项后,它运行良好。
检查您的所有捆绑资源是否已在构建阶段复制。
产品 => 清洁对我有用
答案是您只需将文件夹拖放到项目上,然后单击复制。
当我从另一个项目中拖放一些源文件时,我收到了这条消息。当我删除它们然后通过“文件”菜单中的“添加文件...”添加它们时,它的构建没有错误。
我在使用 NSManagedObject 时遇到了类似的错误,这是因为我使用的是 Core Data,但在 Build Phases - Link Binary With Libraries 中缺少 Core Data 框架,正如其他人回答的那样
如果您在项目中添加需要项目中未包含的本机框架的第三方库,则可能会出现此类错误。
您需要查看新添加的库的 .h 和 .m 文件并查看它需要哪些框架,然后将这些框架包含在您的项目中(Target > Build Phases > Link Binary With Libraries)。
尝试删除框架,清理项目,将其添加回来并编译。或者删除xcode在编译源中添加的类,清理项目,添加回来然后构建。
请记住,您可以在任何调用已删除文件的视图控制器中放置一些宏。
在您构建应用程序之前,该应用程序不会显示任何错误,它会在 .o 文件的编译阶段抛出错误。
请记住删除任何调用已删除文件的宏。
谢谢 :)
除了 Allan 所做的添加缺失的类之外,我还按照 @emdog4 的解决方案添加了 Core Data 库,方法是转到 Xcode 中的 Build Phases 并在“Link Binary with Libraries”下单击 + 并选择“CoreData.framework” .这解决了我的错误
不定期副业成功案例分享
-lLibraryName_$(PLATFORM_NAME)d
,为 Release 添加-lLibraryName_$(PLATFORM_NAME)