2

XCode で C++ のライブラリを作成しようとしていて、それを iPhone プロジェクト内で使用しようとしています。XCode 4.3.2 を使用しています。iOS 開発では C++ ライブラリを作成するためのテンプレートが用意されていないため、Mac OSX - Framework & Library -> C/C++ Library オプションを使用しています。

このプロジェクトには、.h ファイルと .cpp ファイルがあります。後で Android または Windows 8 で使用される可能性があるため、意図的に C++ コードを .cpp ファイルに保持したいと考えています。サンプルの 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 プロジェクトで、この静的ライブラリにリンクしました。C++ スタティック ライブラリ プロジェクトではなく、iPhone プロジェクトのターゲットで「ソースを次のようにコンパイル: Objective-C++」を選択した場合にのみ、コンパイルとデバッグを正常に行うことができます。コンパイル ソースを次のように変更すると、「ファイル タイプに従って」、コンパイル エラーが発生します。

不明な型名 'class'; 'Class' のことですか? トップレベルのデコレータの後に「;」が必要です。

私の質問は、静的ライブラリ C++ プロジェクトではなく、iPhone プロジェクト プロパティのターゲット コンパイル タイプを Objective-C++ に変更することを強制することですか、それとも別の方法がありますか?

この点でどんな助けでも大歓迎です!

ありがとう、アシーシュ

4

1 に答える 1

7

質問を編集して、コンパイラが気に入らない実際のソースコードの一部を含めると、問題を理解するのに役立ちます。

そうは言っても、ファイルにC++クラス定義を含むファイルをしようとしている#include(またはしようとしている#import)と思います。.h.m

ファイルは (既定では) .mObjective-C++ ファイルではなく、Objective-C ファイルであるため、コンパイラは.mファイル内の C++ 構造を拒否します。.mファイルがファイルをインクルード/インポートする場合、.hその.hファイルには Objective-C コードのみが含まれている必要があります。C++ または Objective-C++ コードではありません。

あなたは、Objective-C++ を使用してラッパー レイヤーを作成したと言っています。したがって、おそらく、ラッパー クラスのWrapper.hを宣言するような名前のファイルがあり、ラッパー クラスの(Objective-C++ の) を含む があります。@interfaceWrapper.mm@implementation

にC++ コードWrapper.hが含まれていないことを確認する必要があります。ファイルにインクルード/インポートするため、Objective-C のみを含めることができます。Wrapper.h.m

C++ ライブラリからヘッダー ファイルをインクルード/インポートする場合Wrapper.hは、それを取り出す必要があります。C++ ライブラリ ヘッダー ファイルは、ファイルに直接含める.mmか、ファイルからのみ含める他の.hファイルにのみ含めることが.mmできます。

于 2012-08-09T17:21:37.697 に答える