質問

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

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

ありがとう、 ロビー

役に立ちましたか?

解決

「名前のマングリング」と呼ばれるものの形で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コードではクラスを使用できないため、同じ方法でクラスを渡すことはできませんが、ポインターを渡すことはできます(ただし、型について少し嘘をつく必要がある場合があります) )。

他のヒント

私が取り組んでいるプロジェクトのほとんどには、ObjCフロントエンドとC ++バックエンドがあります。関数のみを扱う場合、Dave Gambleの名前マングル修正は正しいですが、ObjCとC ++オブジェクトの両方を扱う必要があるより複雑な状況を扱う場合、C ++オブジェクトをラップするのが最善の策ですObjCオブジェクト内。不透明な参照( void * を言うのは非常に派手な方法です)を使用して、ObjCでC ++オブジェクトを実際に処理できます。参考になるサンプルコードがあります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top