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