在XCode中创建要在Obj-C中使用的C++库

ash*_*977 2 c++ wrapper objective-c++

我正在尝试在XCode中用C++创建一个库,我试图在iPhone项目中使用它.我正在使用XCode 4.3.2.由于iOS开发中没有现成的模板来创建C++库,我使用的是Mac OSX - Framework&Library - > C/C++ Library选项.

在这个项目中,我有.h和.cpp文件.我故意想将我的C++代码保存在.cpp文件中,因为它可能稍后在Android或Windows 8上使用.为了将它链接到示例iPhone项目,我已经修改了项目的目标以指向最新的SDK iOS 5.1 ,并使用架构armv6和armv7.

以下是我的.h文件

#ifndef Test_Test_h
#define Test_Test_h
class Test {   --> I get the error here saying unknown type 'class'; did you mean 'Class'?

public:
Test();
~Test();
int addTwoNums(int a, int b);
};


#endif
Run Code Online (Sandbox Code Playgroud)

以下是我的C++库中的.cpp文件

#include <iostream>
#include "Test.h"
Test::Test(){}
Test::~Test(){}
int Test::addTwoNums(int a, int b)
{
return (a + b);
}
Run Code Online (Sandbox Code Playgroud)

现在为了在我的iPhone项目中启用函数调用,我创建了一个在.mm类中嵌入C++对象的包装层,这篇文章由本文提供:http://www.philjordan.eu/article/mixing-objective-c- C++ -和目标c ++

以下是我的包装头文件的实现,它是我单独的iPhone项目的一部分

#import <Foundation/Foundation.h>
@interface TestWrapper : NSObject
-(id)init;
-(int)returnSumFromCpluspus:(int) a b:(int) b;
@end
Run Code Online (Sandbox Code Playgroud)

以下是我的独立iPhone的包装.mm文件的实现

#import "TestWrapper.h"
#import "Test.h"
@implementation testWrapper
{
Test *tst;
}

-(id) init
{
self = [super init];
    if (self) {
    tst = new tst();
    if(!tst)
        self = nil;
}
return self;
}

-(int)returnSumFromCpluspus:(int) a b:(int)b
{
int result = 0;
if(tst)
    result = tst->addTwoNums(a,b);
return result;
}

- (void)dealloc
{   
 if(tst)
 delete tst;
}
@end
Run Code Online (Sandbox Code Playgroud)

现在在我的iPhone项目中,我将它与这个静态库相关联.只有在我的iPhone项目的目标中选择"编译源代码:Objective-C++"而不是我的C++静态库项目时,我才能编译和调试.如果我将编译源更改为:根据"文件类型",我得到编译错误:

未知类型名称'class';你的意思是'Class'吗?在顶级装饰者之后预期';'.

我的问题是必须将我的iPhone项目属性目标编译类型更改为Objective-C++,而不是我的静态库C++项目,还是有另一种方式,我可能会丢失并且不知道?

在这方面的任何帮助将不胜感激!

谢谢,Asheesh

rob*_*off 6

如果您编辑问题以包含编译器不喜欢的一些实际源代码,这将有助于我们理解您的问题.

也就是说,我认为您正在尝试#include(或#import)在.h文件中包含C++类定义的.m文件.

.m文件是(默认)一个Objective-C文件,而不是一个Objective-C++文件,所以编译器将拒绝下在++结构.m文件.如果.m文件包含/导入.h文件,则该.h文件还必须仅包含Objective-C代码 - 而不是C++或Objective-C++代码.

你说你已经使用Objective-C++编写了一个包装层.所以你可能有一个像Wrapper.h这样的文件声明@interface你的包装类,你有一个Wrapper.mm包含@implementation(在Objective-C++中)包装类.

您需要确保不Wrapper.h包含C++代码.它只能包含Objective-C,因为您要Wrapper.h.m文件中包含/ import .

如果您Wrapper.h从C++库中包含/导入头文件,则需要将其取出.您只能将C++库头文件直接包含在.mm文件中,或者包含在文件中的其他.h文件中..mm