如何解决Objective-C ++中出现的链接错误,而不解决Objective-C中出现的链接错误?

我正在将我的App Delegate文件从.m转换为.mm(Objective-C到Objective-C ++),以便我可以访问用Objective-C ++编写的第三方库。 在Objective-C中,我的app委托构建并运行良好。 但是当我更改扩展时,项目构建并且我得到链接错误,所有这些都是我用C编写的静态库中缺少的符号。 错误是经典链接错误,格式如下:

“MyFunction(arguments)”,引自:

– MyAppDelegate.o中的[MyAppDelegate myMethod]

未找到符号

所有问题都在app delegate对象中。 我知道我已经准备好编译Objective-C ++,因为我的ViewController文件是.mm。 所以我的问题有几个部分。

首先,这些符号真的不存在,因为我不能使用它们吗? 换句话说,是否无法从Objective-C ++文件访问普通的旧C函数? 如果这是真的,那很不幸。 我认为几乎所有的Objective-C代码,以及至少构建为.mm的所有Objective-C代码都是有效的Objective-C ++。 我错了吗?

如果没有,任何想法如何防止这些错误? 是否存在Objective-C ++中我不了解的标题规则?

感谢您的帮助。

链接错误与混合C ++ / C或C ++ / Objective-C程序通常是由于C ++名称修改。 确保所有相应的声明都附加了extern "C" ,并且所有代码都同意链接。 也就是说,确保函数定义及其使用的位置都可以看到extern "C"extern "C++"

在您的特定情况下,看起来MyFunction()正在使用C ++链接进行编译并且其名称被破坏,但是您的myMethod Objective-C文件正在尝试链接到未编码的名称。

这是关于名称修改的维基百科文章的链接。

你的标题包括extern C

这告诉链接器库中的函数名称没有得到C ++名称修改。

例如:

  extern "C" { #include "my-lib.h" }