2009-08-15 1 views
1

私はiPhoneに移植しようとしているC++アプリケーションを持っています。私はC++のテクスチャローダーをobj-C++のテクスチャローダーに置き換えようとしています。私はココアの図書館を利用することができます。 Obj-を持ってC++ファイルのObjective-C++ファイルを使用する

GLuint mTexture = TextureLoader::LoadTexture("file.png") //LoadTexture is a static method` 

が、私は(.mmファイル内)TextureLoaderクラスを作成しようとするたび:

私のC++ファイル(.CPPファイル)の多くのようなものでテクスチャローダーを呼び出しますCコードでは、呼び出し元のクラスを.mmファイルにする必要があります。

私は、.mmの使い方を避けたいと思います。どうしたらいいですか?それも可能ですか?

は基本的に私は持ってい.mmファイル...

GLuint TextureLoader::LoadTexture(const char* path) 
{ 
    //...lots of c and obj-c code 
    return texture 
} 

を持っているし、離れてC++クラスのである(この時点で、またはそれOBJ-C++のですか?)

私はなりたいです呼び出しクラスを作成することなく.cppファイルから使用することができます。mm

これはどうしてですか?

乾杯。

答えて

0

私はそれを行う方法を知らない。ただし、すべてのC++メンバー関数定義を単一のファイルに入れる必要はありません。純粋なC++のすべてを.cppに貼り付け、ObjCを必要とするものは.mmにしてください。

同様に、あなたが実際に同じ繰り返しにObjCコード(おそらくパラメータ化)を有する場合、1つの別個.mmに無地C関数またはC++クラスにそれをリファクタリング - 何にObjCがないように、対応する.hに構築 - 及びヘッダをインクルードして必要な場所でその関数/クラスを使用します。

+0

おかげパベル、あなたは正確にそれを得ました。問題は、テクスチャ読み込みコードのヘッダファイルにObj-cコードがあったに違いないと思います。つまり、私のC++コードに.hファイルが含まれるようになったとき、コンパイラはそれを気に入らなかった。 私が試してみて、要約します: は、そのメンバーのメソッド(OBJ-Cのコードを使用するC++クラスの定義が含まれている、私はFoo.cppとがfoo.h(C++のみ)を持っているとFoo.cppはTextureLoader.hを含む必要があると言いますTextureLoader.mmで)。そこにはOBJ-CやココアのコードがTextureLoader.hにされていないか、他Foo.cppがそれを#includeすることはできませんことを確認してください。 – user156848

+0

明白な答えは - にObjCは、ヘッダファイルで構築使用あなたのメンバ関数を定義していません。その代わりに.mmファイルで定義してください。 –

4

私は.mmの使い方を避けたいと思います。どうしたらいいですか?それも可能ですか?

Objective-C++を使用しない場合は、いいえ。

1

最も簡単なことは、Objective-C++としてすべてをコンパイルすることです。すべての拡張機能を変更する必要はありません。 '012cc'のままにして、Objective-C++としてすべてをコンパイルするようにXcodeを設定します。プロジェクトのビルド設定で、カテゴリ "GCC X.X - Language"で "ソースをコンパイルする"を "Objective-C++"に変更します。

(私はあなたの問題はあなたが.cppファイルの全体の束を持っていることであると仮定し、そしてあなたが.mmにそれらすべての名前を変更するように感じることはありません。実際にはないものには影響しませんとしてのObjective-C++をコンパイル情報の取得」(のみ非常にまれな例外を除いて)すべてのObjective-Cのものを使用し、それが行うもののためにあなたの人生容易になりますよ。)Xcodeで

0

、あなたの.cppファイルを右クリックし、 " [全般]タブで、ファイルの種類をsourcecode.cpp.objcppに変更します。これにより、このファイルとObjective C++としてのこのファイルのみがビルドされます。

0

コードのサイズが不明だが、インターフェイスがかなり小さい場合は、C++コード用のCラッパーを作成してから、ヘッダーファイルの宣言と関数定義の周りにextern C { /* ... */ }を使用することができます。

これは、Objective-CからのC++呼び出しを本質的に「隠す」ため、mからmm拡張子へのファイルの名前変更の要件、および/または呼び出し元ファイルをObjective-Cとしてコンパイルする必要性を回避できます。 -C++。

のObjective-C++は、別のコンパイラ規則を使用し、標準的なObjective-Cのコンパイルよりも遅いです。

関連する問題