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

时间:2013-02-16 19:12:37

标签: objective-c cocoa frameworks linker

我试图将来自此IOS项目的苹果SimpleFTPsample移植到我的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类中的错误?我在编译之前没有收到任何错误。

谢谢

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

1 个答案:

答案 0 :(得分:2)

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

有两种方法可以实现:

编译失败

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

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

999‰的编译失败是因为模块包含错误 - 语法错误,无法识别的名称(例如,拼写错误/拼写错误),或者其他一些编译失败的错误。

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

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

你甚至没有尝试编译它

这是你遇到的那个。

每个目标都有一个构建阶段列表,每个阶段都描述了构建目标所需要完成的事情。大多数目标至少包含Compile Sources和Link Binary with Libraries阶段。每个构建阶段都有一个输入文件列表。

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

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

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

无论哪种方式,您都会收到该错误消息,告诉您您尝试使用的目标中没有列出您尝试使用其内容的模块。

有两种方法可以解决它:

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

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