【问题标题】:error in porting code from ios to osx project将代码从 ios 移植到 osx 项目时出错
【发布时间】:2013-02-16 19:12:37
【问题描述】:

我尝试将 Apple 的 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)

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

谢谢

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

【问题讨论】:

  • 可能您正在使用属于 iOS 的框架,并且因为目标是 OS X,它不会编译?只是猜测。
  • 嗯,如果框架是用于 IOS 的,那么那个 simpleFTPsample 怎么能移植到 OSX 上呢?我怎样才能找到那个特定的框架是什么?
  • 唯一的框架是cfnetwork,似乎与OSX兼容
  • 清理然后重新构建。您对 NetworkManager.m 有任何编译错误吗? NetworkManager.m 是否被编译过?
  • 您可以通过查看构建日志来查看它是否已编译(不要与构建导航器混淆;构建日志在日志导航器中)。对于 Xcode 尝试编译的每个模块,您应该有一个“Compile whatever.m”行。

标签: objective-c cocoa frameworks linker


【解决方案1】:

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

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

编译失败

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

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

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

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

解决这个问题的方法是导航到 SomeClass.m 并修复它的所有问题,然后再次尝试构建。

你甚至没有尝试编译它

这是你遇到的那个。

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

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

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

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

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

有两种修复方法:

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

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

【讨论】:

  • Maaaany 感谢这个美丽的答案!将其添加到我的有用信息列表中! :)
猜你喜欢
  • 2018-09-28
  • 2015-06-01
  • 2011-03-30
  • 2015-07-15
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
相关资源
最近更新 更多