objective-c - 将代码从 ios 移植到 osx 项目时出错

标签 objective-c cocoa frameworks linker

我尝试移植 SimpleFTPsample从苹果从这个 IOS 项目到我的 OSX 项目,但是当我尝试构建时出现以下错误。

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_NetworkManager", referenced from:
objc-class-ref in Document-DAE96E3625ECED63.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在网上搜索过,并且已经检查了我复制两次的所有代码,添加了所有框架,并包含了 header 。有人可以帮我找出问题所在,或者更好地解释这意味着什么,以便我将来可以自己解决吗?我如何找出 NetworkManager 类中的问题?编译之前我没有收到任何错误。

谢谢

---编辑--- 忘了提及,我只需要示例中代码的 PUT 部分,我只是检查该部分。其余的都没有被复制过来。我复制了 NetworkManager.h、NetworkManager.m 并从 PUT 文件中复制了我需要的代码部分。

最佳答案

通常,当链接器说“什么?我从来没有听说过那个类”,这意味着实现该类的模块(SomeClass.m)没有被编译。

发生这种情况的方式有两种:

编译失败

这会导致请求 SomeClass.o (在您的情况下为 NetworkManager.o)时出错。这不是您遇到的错误,但足够相似,我觉得值得在这里列出。

链接器需要一个目标文件,该文件是由成功编译生成的。如果编译失败,则目标文件不存在,因此您将收到“文件未找到:blah/blah/blah/SomeClass.o”错误。

999‰的编译失败是因为模块包含错误——语法错误、无法识别的名称(例如拼写错误/拼写错误)或其他导致编译失败的缺陷。

构建错误导致其他构建错误相当常见,因此您应该始终从列表顶部向下处理错误。

此问题的解决方案是导航到 SomeClass.m 并修复其中存在的所有问题,然后再次尝试构建。

你甚至没有尝试编译它

这就是你遇到的。

每个目标都有一个构建阶段列表,每个阶段都描述构建目标需要完成的事情。大多数目标至少有编译源和链接二进制与库阶段。每个构建阶段都有一个输入文件列表。

编译源阶段的输入文件是 Xcode 将尝试编译的模块文件。将二进制文件与库链接将隐式链接编译器生成的所有内容(所有目标文件)及其列表中的库,例如 Cocoa.framework。

对于每个目标,Xcode 将尝试编译处于该目标的编译源构建阶段的模块。

很可能忘记将模块添加到目标,但仍尝试在同一目标内的另一个模块中使用它。也许您很久以前为另一个目标创建了该模块,现在想在您现在正在处理的目标中使用该代码,或者您可能只是忘记在创建模块或以其他方式将其添加到项目。

无论哪种方式,您都会收到该错误消息,告诉您您尝试使用其内容的模块未在您尝试使用它的目标中列出以供编译。

有两种方法可以修复它:

  • 选择或导航到“缺失”模块并显示文件检查器 (⌘⌥1),然后选中“目标成员资格”下相应目标的复选框。
  • 在项目导航器中选择项目对象,在编辑器中选择目标,切换到“构建阶段”选项卡,然后将“缺失”模块从项目导航器拖到编译源构建阶段。

防止这种情况的方法是确保在将模块添加到项目时检查相关目标。这包括创建新模块和添加您从其他人那里获得的模块(例如开源可重用类)。

关于objective-c - 将代码从 ios 移植到 osx 项目时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14914071/

相关文章:

cocoa - 如何使用 NSComboBoxCell、NSTableView 和 Core Data 设置关系

适用于 App Engine 的 Python REST 框架?

android - Windows 开发人员查看 Android 框架源代码的简便方法?

iphone - 配置时立即使用属性还是使用临时变量?

objective-c - 从 UIStackView 崩溃应用程序中删除排列的 subview

objective-c - 在应用程序崩溃或用户点击主退出按钮之前重新启用空闲计时器?

cocoa - 全屏隐藏 NSToolbar

cocoa - 处理 Cocoa 中 NSSegmentedControl 选定的段更改

java - 日志记录框架注意事项

ios - 如何从远程通知操作按钮打开应用程序