我正在编写一个图形应用程序,使用Objective-C作为前端,使用C ++编写图形处理和网络通信。我在Apple的网站上阅读,寻找一种方法将 .dylib 或 .so 与我的C ++代码链接到我的Xcode项目,但似乎没有任何效果。我能够让项目引用它并链接它,但当我试图从.dylib调用函数时,它说它不知道我想要做什么。有谁知道这里发生了什么?
我知道Objective-C拥有我需要做的图形和网络所需的所有库,但我只是觉得这样做。我有一段时间没有做太多的C ++,我想学习更多的Objective-C,那么有什么比一起使用它更好的方法呢?
谢谢, 罗比
答案 0 :(得分:15)
我工作的大多数项目都有一个ObjC前端和C ++后端。如果你只处理函数,那么Dave Gamble的名称修复是正确的,但是如果你正在处理更复杂的情况,你需要处理ObjC和C ++对象,你最好的办法是包装C ++对象在ObjC对象中。使用不透明引用(这是一种非常奇特的方式来说void*
),你实际上可以在ObjC中处理C ++对象,反之亦然。我有一些可能有用的sample code。
也就是说,对于图形,您可能会在使用自定义C ++而不是使用Core Image和相关框架时受到严重影响。 Core Image和其他图形框架针对Mac进行了高度优化,使用手动C ++(甚至是非常适合Mac的编写得很好的C ++)也不太可能做得更好。当您转向10.6和大型中央调度时,性能差异将更加显着,因为您将失去所有免费获得的并行化进展。这与ObjC无关; Core Image是C.你可以用C ++来调用它。我建议不要使用任何语言在Mac上进行自定义图形处理,除非您需要便携性或者您具备击败Core Image所需的专业知识。
答案 1 :(得分:14)
你将以所谓的“名称重整”的形式遇到一个障碍。 C ++以与Obj-C不兼容的方式存储函数名称。
Objective-C没有像C ++一样实现类,所以它不会喜欢它。
解决这个问题的一种方法是实现一组调用C ++函数的简单C函数。保持C函数的数量尽可能低是一个很好的挑战!你最终会得到一个漂亮的紧凑界面! :)
要在C ++文件中声明这些函数,您需要将它们标记为C with:
extern "C" int function_name(char *blob,int number, double foo) {...}
这会禁用标准名称修改。
使用您可以与目标C代码共享的所有这些函数的原型构建头文件。
您将无法以相同的方式传递类(因为您的ObjC代码无法使用它们),但您将能够传递指针(尽管您可能不得不对这些类型撒谎) )。