【问题标题】:Undefined symbol for an ObjC framework while linking with .mm source与 .mm 源链接时 ObjC 框架的未定义符号
【发布时间】:2018-03-09 16:55:28
【问题描述】:

我有一个来自 3rd 方的框架,它在他们的.m 文件中实现了这个功能,并在他们的框架头文件中声明:

void foo();

当我在我的 .mm 中使用它时,我得到 foo() 的未定义符号错误。

我知道将上述声明包含在外部“C”中的第 3 方标头中可以解决链接器错误。

但是,问题是为什么在我的 .mm 或相关标头中包含框架标头的#include 不能解决它? 另外,.mm 找不到 foo() 的符号的原因是什么?

【问题讨论】:

    标签: c++ objective-c c xcode


    【解决方案1】:

    当您使用 .m 编译时,foo 将被视为 C 符号。而使用 .mm 文件扩展名告诉 Xcode 将文件视为 Objective-C++ 文件。如果您转到文件检查器,您应该会看到类似这样的内容。

    在这种情况下,foo 会进行名称修改,这在 C++ 中是必需的,因为相同的标识符(在这种情况下为 foo)可以以多种方式使用(例如,函数重载)。

    由于您在 .mm 中包含标头,因此它被视为 Objective-C++。您需要extern "C" 来防止foo 被破坏,这将使链接器能够使用框架中的正确符号名称。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多