9

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

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

ありがとう、ロビー

4

2 に答える 2

15

私が取り組んでいるプロジェクトのほとんどには、ObjCフロントエンドとC++バックエンドがあります。関数のみを扱っている場合は、Dave Gambleの名前マングル修正は正しいですが、ObjCオブジェクトとC ++オブジェクトの両方を扱う必要がある、より複雑な状況を扱っている場合は、C++オブジェクトをラップするのが最善の策です。 ObjCオブジェクトで。不透明な参照(これは非常に凝った言い方ですvoid*)を使用すると、実際にObjCでC ++オブジェクトを渡すことができ、その逆も可能です。役立つサンプルコードがいくつかあります。

そうは言っても、グラフィックスの場合、Core Imageや関連するフレームワークを使用するのではなく、カスタムC++を実行することでパフォーマンスに深刻な打撃を与える可能性があります。Core Imageやその他のグラフィックスフレームワークはMac向けに高度に最適化されており、手巻きのC ++(またはMac専用ではない非常によく書かれたC ++)でうまくいく可能性はほとんどありません。10.6とグランドセントラルディスパッチに移行すると、無料で得られる並列化の進歩がすべて失われるため、パフォーマンスの違いはさらに顕著になります。これはObjCとは何の関係もありません。CoreImageはCです。C++から好きなように呼び出すことができます。移植性が必要な場合や、Core Imageを打ち負かすのに必要な専門知識がない限り、Macでのカスタムグラフィックス処理はどの言語でも行わないことをお勧めします。

于 2009-08-05T14:18:58.737 に答える
14

「ネームマングリング」と呼ばれるものの形で 1 つの障害にぶつかります。C++ は、Obj-C と互換性のない方法で関数名を格納します。

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

これを回避する 1 つの方法は、C++ 関数を呼び出す一連の単純な C 関数を実装することです。C 関数の数をできるだけ少なくすることは、良い挑戦になるでしょう! 素敵なコンパクトなインターフェイスになります! :)

これらの関数を C++ ファイルで宣言するには、次のように C としてマークする必要があります。

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

これにより、標準の名前マングリングが無効になります。

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

同じ方法でクラスを渡すことはできませんが (ObjC コードではクラスを使用できないため)、ポインターを渡すことはできます (ただし、型について少し嘘をつく必要があるかもしれません)。

于 2009-08-05T14:02:53.810 に答える