与.mm源链接时ObjC框架的未定义符号

时间:2018-03-09 16:55:28

标签: c++ objective-c c xcode

我有一个来自第三方的框架,它在他们的.m文件中实现了这个功能,并在他们的框架头中实现了十进制:

void foo();

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

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

然而,问题是为什么不在我的.mm或相关头中包含框架头的#include来解决它? 另外,.mm?

找不到foo()符号的原因是什么?

1 个答案:

答案 0 :(得分:0)

使用.m进行编译时,foo将被视为C符号。而使用.mm文件扩展名告诉Xcode将该文件视为Objective-C ++文件。如果你去File Inspector,你会看到类似的东西。

enter image description here

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

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