9

我正在编写一个图形应用程序,前端使用 Objective-C,图形处理和网络通信使用 C++。我在 Apple 的网站上四处阅读,寻找一种将.dylib.so与其中的 C++ 代码链接到我的 Xcode 项目的方法,但似乎没有任何效果。我能够让项目引用它并链接它,但是当我试图从那个 .dylib 调用函数时,它说它不知道我在做什么。有谁知道这里发生了什么?

我知道 Objective-C 拥有我需要做图形和网络的所有库,但我只是想这样做。我有一段时间没有做太多 C++ 了,我想学习更多 Objective-C,那么有什么比一起使用它们更好的方法呢?

谢谢,罗比

4

2 回答 2

15

我从事的大多数项目都有 ObjC 前端和 C++ 后端。如果你只处理函数,那么 Dave Gamble 的名字 mangle fix 是正确的,但如果你处理更复杂的情况,你需要同时处理 ObjC 和 C++ 对象,你最好的办法是包装 C++ 对象在 ObjC 对象中。使用不透明引用(这是一种非常奇特的说法void*),您实际上可以在 ObjC 中处理 C++ 对象,反之亦然。我有一些示例代码可能会有所帮助。

也就是说,对于图形,使用自定义 C++ 而不是使用 Core Image 和相关框架可能会对性能造成严重影响。Core Image 和其他图形框架针对 Mac 进行了高度优化,您不太可能使用手动 C++(甚至不是专门为 Mac 编写的非常好的 C++)做得更好。随着您迁移到 10.6 和大型中央调度,性能差异将更加显着,因为您将失去所有可以免费获得的并行化进步。这与 ObjC 无关;Core Image 是 C。你可以随心所欲地从 C++ 调用它。我只是建议不要在 Mac 上以任何语言进行自定义图形处理,除非您需要便携性或者您拥有击败 Core Image 所需的专业知识。

于 2009-08-05T14:18:58.737 回答
14

您将遇到一个障碍,即所谓的“名称修改”。C++ 以与 Obj-C 不兼容的方式存储函数名称。

Objective-C 实现类的方式与 C++ 不同,因此它不会喜欢它。

解决此问题的一种方法是实现一组调用 C++ 函数的简单 C 函数。尽量减少 C 函数的数量将是一个很好的挑战!你最终会得到一个漂亮紧凑的界面!:)

要在 C++ 文件中声明这些函数,您需要将它们标记为 C:

extern "C" int function_name(char *blob,int number, double foo) {...}

这将禁用标准名称修饰。

为您可以与目标 C 代码共享的所有这些函数的原型构建一个头文件。

您将无法以相同的方式传递类(因为您的 ObjC 代码无法使用它们),但您将能够传递指针(尽管您可能不得不对类型撒谎)。

于 2009-08-05T14:02:53.810 回答