【问题标题】:Why am I getting "_OBJC_CLASS_$..., referenced from:" linker error when I have correctly linked frameworks?当我正确链接框架时,为什么会收到“_OBJC_CLASS_$...,引用自:”链接器错误?
【发布时间】:2012-03-13 09:31:57
【问题描述】:

我的问题

编译某些 Xcode 项目时出现“_OBJC_CLASS_$...,引用自:”链接器错误(iOS 和 Mac 项目中都会发生)我已正确链接框架和导入。

设置

  • 一个应用目标
  • 一个测试目标
  • 所有框架链接正确

编译时出现以下链接器错误: “_OBJC_CLASS_$_JGCountdownTimer”,引用自: JGCountdownTimerTestCase.o 中的 objc-class-ref

适用于测试中使用的许多类。

我的尝试

  • 检查导入是否全部存在
  • 删除了所有非标准框架
  • 如果我为测试目标和应用目标编译一个类,它可以解决问题。但后来我收到了来自编译器的其他警告。

【问题讨论】:

  • 在您的目标 - 构建阶段检查是否缺少 JGCountdownTimer.m 文件?
  • 我相信你知道,这意味着在编译过程中使用了名称(JGCountdownTimer),但是在链接过程中,没有找到目标文件。 JGCountdownTimer 是来自二进制文件还是类文件?我唯一遇到这个问题是由于循环引用。会是这样吗?如果是,请使用 @class 指令。祝你好运。
  • 嘿伙计们-感谢您的评论。我在发布之前解决了这个问题,但是我找不到任何其他具有我找到的答案的帖子,所以我提出了一个问题,以便我可以自己回答并获得权威的答案!
  • 解决方案是将GCC_SYMBOLS_PRIVATE_EXTERN = NO 添加到构建设置中。

标签: objective-c xcode linker compiler-errors


【解决方案1】:

objc_class_$textfieldvalidator 引用自

Compile 不会将那些复制的文件包含在其编译列表中。修复此错误 选择文件或文件夹,然后转到 Build Phases 面板并打开 Compile Sources 步骤,然后单击 + 按钮并将它们添加到所有文件或文件夹中。

右键单击项目文件夹,单击“将文件添加到...”,选择文件,单击选项按钮并选择目标,然后单击添加。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。我收到链接器错误:

    _OBJC_CLASS_$_MyClass

    问题是我为MyClass 声明了一个@interface,但没有声明其对应的@implementation

    解决方法是简单地添加

    @implementation MyClass
    @end
    

    【讨论】:

      【解决方案3】:

      快速解答

      将以下行复制并粘贴到您的构建设置中:

      GCC_SYMBOLS_PRIVATE_EXTERN = 否

      在目标构建设置中查找“默认隐藏的符号”。对于调试配置,您想要“否”。

      这个问题我已经断断续续有好几个月了,我刚刚发现了原因。

      【讨论】:

      • 您也可以在@interface 前加上__attribute__((visibility("default")))
      • 在构建设置中粘贴 GCC 的东西?
      • 搜索 GCC_SYMBOLS_PRIVATE_EXTERN 并将其设置为 No
      • 当我搜索 GCC_SYMBOLS_PRIVATE_EXTERN 时,我得到 Symbols Hidden by Default 已经设置为 No。还有其他解决方案吗?
      • @Wevah 非常感谢您的评论!如果您将解决方案发布为答案,我会很高兴。我结束了在answer 中发布我的技术经验
      【解决方案4】:

      不确定这是否是问题所在,但使用新编译器,任何未显式引用/调用的 obj-c 都不会从库中链接。例如,当您在库中实现类别时,这会导致问题。

      尝试在目标的构建设置面板中将“-ObjC”添加到“附加链接器标志”。 耸耸肩

      【讨论】:

      • 感谢您的快速回答 - 我发布这个是因为我实际上找到了解决方案,它让我发疯,我在其他任何地方都找不到答案,所以我想我会在这里发布它其他一些不幸的灵魂得到这个链接器错误并且无法理解为什么。
      • 这个答案有点误导。链接静态库时,默认情况下,编译器(gcc 和 clang)只会链接以某种方式引用的库成员。指定 -ObjC 链接器标志意味着链接所有具有 Obj-C 类/类别信息的成员。这根本不会影响 dylib 或应用程序代码,只会影响静态库。
      • kevin: 是的......这有点像在黑暗中刺伤:)
      猜你喜欢
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2014-12-13
      • 1970-01-01
      相关资源
      最近更新 更多