4

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

“MyFunction(arguments)”,引用自:

-MyAppDelegate.o 中的[MyAppDelegate myMethod]

未找到符号

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

首先,这些符号在我不能使用的意义上真的不存在吗?换句话说,是否不可能从 Objective-C++ 文件中访问普通的旧 C 函数?如果这是真的,那就太不幸了。我认为几乎所有的 Objective-C 代码,当然所有至少构建为 .mm 的 Objective-C 代码都是有效的 Objective-C++。我错了吗?

如果没有,知道如何防止这些错误吗?Objective-C++ 中是否有我不知道的不同标头规则?

感谢您的任何帮助。

4

2 回答 2

8

混合 C++/C 或 C++/Objective-C 程序的链接错误通常是由于 C++ 名称修改造成的。确保您已extern "C"附加到所有适当的声明,并且您的所有代码都同意链接。也就是说,确保函数定义以及使用它的地方都可以看到extern "C"or extern "C++"

在您的特定情况下,它看起来像是MyFunction()使用 C++ 链接进行编译并且其名称已损坏,但您的myMethodObjective-C 文件正试图链接到未损坏的名称。

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

于 2010-08-10T18:37:37.073 回答
3

用 .包围您的标题包含extern C

这告诉链接器库中的函数名称不会得到 C++ 名称修饰。

例如:

 extern "C" {
   #include "my-lib.h"
 }
于 2010-08-10T18:37:52.773 回答