2009-08-05 17 views
8

フロントエンドにObjective-Cを使用し、グラフィックス処理とネットワーク通信にC++を使用してグラフィカルアプリケーションを作成しています。 Appleのサイトで、.dylibまたは.soと私のXcodeプロジェクトに自分のC++コードをリンクする方法を探していましたが、何も動作していないようでした。私はそれを参照してリンクするプロジェクトを手に入れることができましたが、その.dylibから関数を呼び出そうとしたら、何をしようとしているのか分からないと言っていました。誰がここで何が起こっているのか知っていますか?Objective-CアプリケーションでC++ライブラリをリンクして使用する

私は、Objective-Cにグラフィックスとネットワーキングを行うために必要なすべてのライブラリがあることを知っていますが、このようにしたいと思っています。私はしばらくの間C++をあまりやっていないし、もっとObjective-Cを学びたいと思っているので、それらを一緒に使うよりも良い方法は何ですか?

おかげで、 ロビー

答えて

13

あなたは、「名前の符号化」と呼ばれるものの形で一つの障害物にヒットするつもりです。 C++はObj-Cと互換性のない方法で関数名を格納します。

Objective-CはC++と同じ方法でクラスを実装しないので、それは気に入らないでしょう。

これを回避する方法の1つは、C++関数を呼び出す一連の単純なC関数を実装することです。できるだけC関数の数を少なくするのは良い挑戦です!素敵なコンパクトなインターフェイスで終わるでしょう!これは、標準的な名前マングリングを無効に

extern "C" int function_name(char *blob,int number, double foo) {...} 

::) C++ファイルでこれらの関数を宣言する

、あなたがCとしてそれらをマークする必要があります。

目的のCコードと共有できるこれらのすべての機能のプロトタイプを使用してヘッダファイルを作成します。

ObjCコードでは使用できないため、同じ方法でクラスを渡すことはできませんが、ポインタを渡すことはできます(ただし、少し)。

+6

Objective-Cファイルの拡張子を.mmに変更してObjective-C++ファイルを作成し、次にC++コードとObjective-Cコードを混在させることもできます。 – Amok

+0

これは私のために働いた。私は '.mm'ファイルでクラスを作成し、C++ライブラリと完全にリンクでき、私の.mファイルからラッパーメソッドを呼び出すことができました。ありがとう! –

13

私が扱っているプロジェクトのほとんどは、ObjCフロントエンドとC++バックエンドです。関数だけを扱っているのであれば、Dave Gambleの名前のマングル修正は正しいですが、より複雑な状況、ObjCとC++オブジェクトの両方を処理する必要がある場合は、C++オブジェクトをラップすることが最善の方法ですObjCオブジェクトで使用します。不透明な参照(これは非常にファンシーな方法であるvoid*です)を使用すると、実際にはObjCのC++オブジェクトを扱うことができます。私は役に立つかもしれないsample codeがあります。

しかし、グラフィックスでは、Core Imageと関連するフレームワークを使用するのではなく、カスタムC++を使用してパフォーマンスに重大な影響を及ぼす可能性があります。 Core Imageやその他のグラフィックスフレームワークは、Mac向けに高度に最適化されており、手作業でC++(あるいはMac用ではない非常によく書かれたC++)を使ってもうまくいくとは考えにくいです。あなたが10.6と大きなセントラルディスパッチに移行すると、パフォーマンスの違いはさらに顕著になります。これは、他の方法であれば無料で利用できるすべての並列化の進歩を失うためです。これはObjCとは関係ありません。コアイメージはCです。C++から呼び出すことができます。私はあなたが移植性を必要としないか、Core Imageを叩くのに必要な専門知識を持っていない限り、どの言語でもMac上でカスタムグラフィックス処理を行うことを推奨します。

+0

こんにちは、私はObjective-C++(.mmファイル拡張子)にC++オブジェクトをラップし、Objective-C(.mファイル拡張子)にはラッピングしていないことが分かりました。私が理解しているように、Objective-Cオブジェクトを持つことはできません** A **はラッパーObjective-C++オブジェクト** B **を使用します。すべての.mファイルの拡張子を '.mm'に変更する必要があります。したがって、Objective-C++プロジェクトを作成する必要があります。 – MichK

+2

それは当てはまりません。 'B.h'が純粋なObjC(C++を宣言していない)である限り、絶対に' A'から 'B'を呼び出すことができます。すべての '.m 'を' .mm'に変更する必要はありません(そうすべきではありません)。 –

関連する問題