在Objective-C Xcode项目中使用C ++静态库

时间:2011-10-23 19:55:17

标签: objective-c++

我在iOS中创建了一个cocoa touch静态库,其中包含C ++类(.h和.cpp文件)。

我成功构建了项目,但是当我包含这个库(具有.a扩展名)和任何.h文件时,我得到了一个编译错误。

如何在Objective-C项目中添加此库并使用C ++类?

3 个答案:

答案 0 :(得分:1)

您的问题很可能是.h标头包含C ++代码。你应该阅读"编译单元"。简而言之,没有办法说出为编译器写入头文件的语言。因此,它始终使用包含标头的源文件的语言。因此,如果您从.m文件中包含C ++标头,则它将无效。

但是有一个解决方案:Apple发明了一种新的语言"它调用Objective-C ++,它允许您在同一个文件中编写C ++和Objective-C语句。对于使用C ++标头的每个 ObjC文件,您必须将使用它的源文件的文件名后缀从.m(ObjC)更改为{ {1}}(ObjC ++),这意味着源文件将能够编译ObjC和C ++标题。

当然,您可能不希望将所有文件更改为ObjC ++。首先,C ++(以及扩展的Objective-C ++)是一种语法比C和Objective-C复杂得多的语言,因此编译时间会更长,而且C ++在某些方面的行为也不同于C(并且通过扩展,ObjC ++的行为与ObjC略有不同。

人们通常做的是将C ++部分限制在其实现文件中,并将C ++保留在标头之外。他们写了一个Objective-C类,它包裹着#34; C ++类,并提供在C ++对象上调用相应C ++方法的方法。然后,项目中的任何ObjC文件都可以包含该类,而无需打开ObjC ++编译器本身(内部("秘密地")使用ObjC ++来调用C ++代码。

有关如何在ObjC类中隐藏C ++代码的一些有用技巧,请参阅Can I separate C++ main function and classes from Objective-C and/or C routines at compile and link?

答案 1 :(得分:0)

如果你在同一个系统上构建了.a,那么#include的标题应该不会出现问题并链接到它。

答案 2 :(得分:0)

很可能你应该重命名你的.m文件,这些文件是特定于.mm文件的目标c,可以接受C ++代码(objective-c ++)。

其次是检查它所依赖的所有内容是否正确地包含在库标题之前。

另请检查您为其构建库的体系结构。如果你在模拟器上运行 - 它应该是x86,如果用于部署到设备 - arm。

相关问题