我有一个来自第三方的框架,该框架已在他们的.m文件中实现了此功能,并在其框架标头中删除了该框架:
无效foo();
当我在.mm中使用它时,我得到foo()的未定义符号错误。
我知道,在外部“ C”的第三方标头中包含上述声明可以解决链接器错误。
但是,问题是为什么在我的.mm或关联的标头中不包含框架标头的#include可以解决该问题?
另外,.mm未找到foo()符号的原因是什么?
最佳答案
当您使用.m编译时,foo
将被视为C符号。而使用.mm文件扩展名则告诉Xcode将文件视为Objective-C ++文件。如果转到文件检查器,应该会看到类似这样的内容。
在这种情况下,foo
会进行名称修饰,这在C ++中是必需的,因为可以以多种方式使用同一标识符(在这种情况下为foo
)(例如,函数重载)。
由于您将标头包括在.mm中,因此将其视为Objective-C ++。您需要extern "C"
防止损坏foo
,这将使链接程序能够使用框架中正确的符号名称。
关于c++ - 与.mm源链接时,ObjC框架的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49198546/