链接和使用C++库与Objective-C应用程序

Rob*_*bie 9 c++ xcode linker objective-c dylib

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

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

谢谢,罗比

Rob*_*ier 15

我工作的大多数项目都有一个ObjC前端和C++后端.如果你只处理函数,那么Dave Gamble的名称修复是正确的,但是如果你正在处理更复杂的情况,你需要处理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所需的专业知识.

  • 这不是真的.只要`Bh`是纯粹的ObjC(声明没有C++),你绝对可以从`A`调用`B`.你绝对不必将每个`.m`改为`.mm`(也不应该). (2认同)

Dav*_*ble 14

你将以所谓的"名称修改"的形式遇到一个障碍.C++以与Obj-C不兼容的方式存储函数名.

Objective-C没有像C++那样实现类,所以它不会喜欢它.

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

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

extern "C" int function_name(char *blob,int number, double foo) {...}
Run Code Online (Sandbox Code Playgroud)

这会禁用标准名称修改.

使用您可以与目标C代码共享的所有这些函数的原型构建头文件.

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

  • 另一个选择是通过将其扩展名更改为.mm来生成Objective-C文件Objective-C++文件,然后可以混合使用C++和Objective-C代码. (7认同)