【问题标题】:Creating a C++ library in XCode to be used in Obj-C在 XCode 中创建要在 Obj-C 中使用的 C++ 库
【发布时间】:2012-08-09 17:11:13
【问题描述】:

我正在尝试在 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

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

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

现在,为了在我的 iPhone 项目中启用函数调用,我创建了一个包装层,将 C++ 对象嵌入到 .mm 类中,由本文提供: 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++ 静态库项目时,我才能很好地编译和调试。如果我将编译源更改为:根据文件类型”,我会得到编译错误:

未知类型名称“类”;您的意思是“类”吗? 应为 ';" 在顶级装饰器之后。

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

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

谢谢, 阿希什

【问题讨论】:

    标签: c++ wrapper objective-c++


    【解决方案1】:

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

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

    .m 文件(默认情况下)是 Objective-C 文件,而不是 Objective-C++ 文件,因此编译器将拒绝 .m 文件中的 C++ 结构。如果.m 文件包含/导入.h 文件,则该.h 文件还必须仅包含Objective-C 代码,而不是C++ 或Objective-C++ 代码。

    您说您使用 Objective-C++ 编写了一个包装层。因此,您可能有一个名为 Wrapper.h 的文件,它声明了包装类的 @interface,并且您有一个包含包装类的 @implementation(在 Objective-C++ 中)的 Wrapper.mm

    您需要确保Wrapper.h 包含没有 C++ 代码。它只能包含 Objective-C,因为您将在 .m 文件中包含/导入 Wrapper.h

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

    【讨论】:

    • 感谢您的回复,罗布。是的,我只在 .mm 文件中包含任何 C++ 头文件,因此任何 Objective-C 头文件都是完全干净的,并且不引用任何与 C++ 类相关的数据。然而,奇怪的是我必须将编译源设置为:Objective-C++ for my iPhone project which call my C++ library。我认为对我的 C++ 库项目这样做是有意义的,但情况正好相反。
    • 好的,我发现了问题。再次查看我的代码时,我不小心在我的 Obj-C 代码中引用了我的 Test.h。删除它修复了错误。非常感谢这个答案。我会竖起大拇指?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多