1

我尝试将 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 文件中复制了我需要的部分代码。

4

1 回答 1

2

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

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

编译失败

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

链接器将需要一个由成功编译生成的目标文件。如果编译失败,则目标文件不存在,因此您将收到“找不到文件: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 构建阶段。

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

于 2013-02-17T17:12:56.327 回答