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

标签 c++ objective-c c xcode

我有一个来自第 3 方的框架,它已在其 .m 文件中实现了此功能,并在其框架 header 中声明:

无效foo();

当我在 .mm 中使用它时,我收到 foo() 的 undefined symbol 错误。

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

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

最佳答案

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

enter image description here

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

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

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

相关文章:

c++ - 尝试将我的项目与外部 opencv 一起使用

c - 如何找到给三分的最高分?

c++ - 英特尔 PIN 例程地址检索 : Linux vs. Windows

c++ - 如何在没有打印语句的情况下报告用户输入错误?

objective-c - 如何恢复 NSMutableArray 的原始排序顺序?

objective-c - 同时禁用多个长按手势

c - 当静态链接 C 库时,是否将整个库添加到可执行文件中?

c++ - 如何使用strcpy将字符串复制到字符数组中

c++ - 在编译时计算常量库函数

ios - 自动布局约束冲突