Objective c 目标C链接器错误:未定义的符号

Objective c 目标C链接器错误:未定义的符号,objective-c,xcode,build,Objective C,Xcode,Build,有未定义的符号意味着什么 代码文件本身没有错误,我也没有使用任何外部库 在发生此链接器错误之前,我确实添加了一个typedef NS_ENUM 在何处添加此-v以查看调用? 以下是错误消息: Undefined symbols for architecture x86_64: "_OBJC_IVAR_$_UIViewController._parentViewController", referenced from: -[PEPI_LessonController setPare

有未定义的符号意味着什么

代码文件本身没有错误,我也没有使用任何外部库

在发生此链接器错误之前,我确实添加了一个
typedef NS_ENUM

在何处添加此
-v以查看调用?

以下是错误消息:

Undefined symbols for architecture x86_64:
  "_OBJC_IVAR_$_UIViewController._parentViewController", referenced from:
      -[PEPI_LessonController setParentViewController:] in PEPI_LessonController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这意味着在链接对象文件时找不到属性parentViewController和方法setParentViewController。这些类型错误最常见的原因是没有链接目标项目中的库或框架。UIViewController是UIKit的一部分,所以如果它还没有链接,我会感到惊讶。这是一个OSX项目,您正在尝试使用UIViewcontroller而不是NSViewController吗?

“未定义的符号”

将源代码文件构建为可执行文件至少包括两个步骤:

  • 将源代码文件编译为中间二进制文件(通常称为
    xyz.o
  • 将中间二进制文件链接到最终可执行文件
  • 错误消息“undefined symbols”是链接器消息。即使编译过程在没有通知的情况下成功,它也可能出现。链接器组织最终的内存地址关系,并替换编译器必须假设它们在以后有效的符号(如果代码的所有部分都可用)。没有这一点,就不可能实现模块化

    -v查看调用

    如果您在Xcode中构建应用程序,那么Xcode将为您调用所有编译和链接命令(
    CompileC
    Ln
    Clang
    …)。但是请记住,典型的IDE只运行您可以在shell中自己运行的命令。理论上,您只能在文本编辑器和shell中开发大型应用程序。因此,我建议您花些时间,尝试将Xcode构建报告中列出的一些命令复制粘贴到shell:-)您将了解很多背景知识。因此,在我看来,在shell中或在构建设置中调用命令时,如果您希望获得更多信息,可以使用
    -v查看调用

    “外部库”

    最后,尝试澄清“外部图书馆”。看一个最简单的例子:即使你写了一个简单的C程序,你想知道一些琐碎的东西,比如字符串的长度,你也会
    包括
    。现在这是一个外部库。它位于程序代码的外部。您确定没有包含外部库吗

    解决链接器问题

    链接器错误常常令人困惑,而且有点困难,因为链接模块的细节往往看不见。如果在搜索引擎中输入错误消息,您可能会发现许多提示。例如,看看这里:


    即使找到了所有用于链接的组件,所有路径都是已知的,等等,它们也可能有错误的版本。

    这是一个iOS(iPad)项目。我实际上是UIViewController的子类,不确定这是否意味着什么。它是今天早上构建的,但是在修改了主控制器(负责选择正确的视图)中的一些代码之后,我开始得到它。在发生此链接器错误之前,我确实添加了一个
    typedef NS_ENUM
    。@Guido Anselmi:Check Xcode>Your project>Targets>“Build Phases”>“Link Binary with Libraries”。大多数链接器问题都在那里解决了。我需要补充什么?我没有在我的项目中使用任何外部库。NS_Enum类是否存在于外部库中?请确保列出UIKit.framework。如果没有,请添加它。NS_Enum不是一个类,也不应该有什么不同。