我正在尝试在XCode中用C ++创建一个库,我正试图在iPhone项目中使用它。我正在使用XCode 4.3.2。由于iOS开发中没有现成的模板来创建C ++库,我使用的是Mac OSX - Framework&图书馆 - > C / C ++库选项。
在这个项目中,我有.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
以下是我的C ++库中的.cpp文件
#include <iostream>
#include "Test.h"
Test::Test(){}
Test::~Test(){}
int Test::addTwoNums(int a, int b)
{
return (a + b);
}
现在为了在我的iPhone项目中启用函数调用,我创建了一个在.mm类中嵌入C ++对象的包装层,这篇文章由本文提供: http://www.philjordan.eu/article/mixing-objective-c-c++-and-objective-c++
以下是我的包装头文件的实现,它是我单独的iPhone项目的一部分
#import <Foundation/Foundation.h>
@interface TestWrapper : NSObject
-(id)init;
-(int)returnSumFromCpluspus:(int) a b:(int) b;
@end
以下是我的独立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
现在在我的iPhone项目中,我已将它与此静态库链接。只有在我的iPhone项目的目标中选择“编译源代码:Objective-C ++”而不是我的C ++静态库项目时,我才能编译和调试。如果我将编译源更改为:根据文件类型“,我得到编译错误:
未知类型名称'class';你的意思是'Class'吗? 在顶级装饰师之后预期';'。
我的问题是必须将我的iPhone项目属性目标编译类型更改为Objective-C ++,而不是我的静态库C ++项目,还是有另一种方式,我可能会丢失并且不知道?
非常感谢在这方面的任何帮助!
谢谢, Asheesh
答案 0 :(得分:6)
如果您编辑问题以包含编译器不喜欢的一些实际源代码,这将有助于我们理解您的问题。
那就是说,我认为您正在尝试#include
(或#import
).h
文件中包含C ++类定义的.m
文件。
.m
文件(默认情况下)是Objective-C文件,而不是Objective-C ++文件,因此编译器将拒绝.m
文件中的C ++构造。如果.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
。
如果您的Wrapper.h
包含/导入C ++库中的头文件,则需要将其取出。您只能将C ++库头文件直接包含在.mm
文件或仅包含.h
个文件的其他.mm
文件中。