如何修复编译 Mach-O 链接器错误

Posted

技术标签:

【中文标题】如何修复编译 Mach-O 链接器错误【英文标题】:How to fix compile Mach-O Linker error 【发布时间】:2012-05-17 20:10:58 【问题描述】:

我正在尝试将此 ios 库 PTImageAlbumViewController 添加到我正在处理的现有项目中,但我遇到了编译错误。包含一个示例项目,它依赖于其他几个库。示例项目工作得很好,但我无法将它迁移到我自己的项目中而不会出现错误。我尝试通过将文件从一个项目拖到另一个项目来直接从项目中提取文件,但它仍然无法正常工作

我有什么遗漏吗?

架构 armv7 的未定义符号: “_OBJC_METACLASS_$_NetworkPhotoAlbumViewController”,引用自: _OBJC_METACLASS_$_PTImageAlbumViewController 在 PTImageAlbumViewController.o “_OBJC_CLASS_$_NIPhotoAlbumScrollView”,引用自: _OBJC_CLASS_$_PTImageAlbumView 在 PTImageAlbumView.o “_OBJC_CLASS_$_NetworkPhotoAlbumViewController”,引用自: _OBJC_CLASS_$_PTImageAlbumViewController 在 PTImageAlbumViewController.o “_NIPathForBundleResource”,引用自: -[PTImageAlbumViewController viewDidLoad] 在 PTImageAlbumViewController.o “_OBJC_METACLASS_$_NIPhotoAlbumScrollView”,引用自: _OBJC_METACLASS_$_PTImageAlbumView 在 PTImageAlbumView.o ld:未找到架构 armv7 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

【问题讨论】:

这可能是由于您的项目缺少框架 teofilo 是正确的,您可能希望将其添加到您的目标中。您可能还需要更改标题搜索路径 我已经在项目中有那些 .h 和 .m 文件了。如何确定缺少哪个框架?? 【参考方案1】:

它找不到的是 nimbus 文件。

如果您已将 nimbus 和 SDURLCache 文件添加到您的项目中,那么只需确保它们包含在您的应用程序的目标中即可。

确保所有文件都进入您的项目并且位于正确的目标中。例如,第一个错误与 NetworkPhotoAlbumViewController.m 有关。该文件是否在您的项目和正确的目标中?

如果是这样,另一种可能性是,出于某种原因,它根本不是为这种架构构建的。您可以通过将树从 DerivedData 目录导航到目标文件的存储位置并使用 nm 在目标文件中搜索丢失的符号来查找。

我的机器上的示例:

cd /Users/username/Library/Developer/Xcode/DerivedData/AlbumDemo-eyqszubjyqhczreurkblqktoxjja/Build/Intermediates/AlbumDemo.build/Debug-iphonesimulator/AlbumDemo.build/Objects-normal/i386

nm NetworkPhotoAlbumViewController.o | grep _NetworkPhotoAlbumViewController
00000000 t -[NetworkPhotoAlbumViewController shutdown_NetworkPhotoAlbumViewController]
0000e0fc s -[NetworkPhotoAlbumViewController shutdown_NetworkPhotoAlbumViewController].eh
0000cde8 S _OBJC_CLASS_$_NetworkPhotoAlbumViewController
0000c9b4 S _OBJC_IVAR_$_NetworkPhotoAlbumViewController._activeRequests
0000c9bc S _OBJC_IVAR_$_NetworkPhotoAlbumViewController._highQualityImageCache
0000c9b0 S _OBJC_IVAR_$_NetworkPhotoAlbumViewController._queue
0000c9b8 S _OBJC_IVAR_$_NetworkPhotoAlbumViewController._thumbnailImageCache
0000cdfc S _OBJC_METACLASS_$_NetworkPhotoAlbumViewController
0000cfe0 s l_OBJC_$_INSTANCE_METHODS_NetworkPhotoAlbumViewController
0000d084 s l_OBJC_$_INSTANCE_VARIABLES_NetworkPhotoAlbumViewController
0000d0e0 s l_OBJC_$_PROP_LIST_NetworkPhotoAlbumViewController
0000d100 s l_OBJC_CLASS_RO_$_NetworkPhotoAlbumViewController
0000cfb8 s l_OBJC_METACLASS_RO_$_NetworkPhotoAlbumViewController

这些符号在第二列中没有“U”这一事实意味着它们是在此目标文件中定义的。你可以从the nm man page找到所有nm输出的含义。

【讨论】:

非常感谢您提供额外的信息和资源!原来我将文件添加到项目中,但它们不是编译源的一部分。不知道为什么没有自动添加它们,因为我确实选中了“添加到目标”按钮。【参考方案2】:

有时当你创建一个新的 Class 文件时,Xcode 不会将它添加到“Compiled Sources”中

选择项目图标>目标>构建阶段>编译源

然后单击 + 按钮添加 Class *.m 文件。

【讨论】:

以上是关于如何修复编译 Mach-O 链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 xcode 中的 Apple Mach-O 链接器错误组问题?

Apple Mach-O 链接器错误,目标 C

如何摆脱 Apple Mach-O 链接器错误?

如何解决 Firebase 中的 Apple Mach-O 链接器错误?

CocoaAsyncSocket Apple Mach-O 链接器错误

Apple Mach-O 链接器错误解析