我有一个来自第三方的框架,该框架已在他们的.m文件中实现了此功能,并在其框架标头中删除了该框架:

无效foo();

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

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

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

最佳答案

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

c++ - 与.mm源链接时,ObjC框架的 undefined symbol-LMLPHP

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

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

关于c++ - 与.mm源链接时,ObjC框架的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49198546/

10-14 21:33
查看更多