5

SSE4.2でコンパイルされたバージョンとSSE3でコンパイルされたバージョンの2つのバージョンのアプリを含むMacOSX用のユニバーサルバイナリを作成できますか?

この場合、SSE4.2でコンパイルされたバージョンは、SSE4.2をサポートするCPUに自動的にロードされます。

いいえの場合、SSE4.2をサポートしていない古いCPUでアプリを実行するための提案を取得したいのですが、SSE4.2をサポートしているCPUでSSE4.2を使用します。

それが問題なら、私はMacAppStoreをターゲットにしていることに注意してください。Xcode4.5でClangを使用しています。

4

1 に答える 1

3

これは、Mac OS Xで使用されるMach-O形式ではサポートされていません。この形式では、さまざまなアーキテクチャのバイナリを使用できます。サブタイプフィールドがありますが、プロセッサの能力ではなく、異なる世代のプロセッサに対して定義された値のみがあります。

これを回避するには、いくつかの方法があります。1つは、異なる関数名を使用して、SSE4.2と古いプロセッサのコードの両方を同じバイナリに組み込むことです。コードは、SSE4.2がサポートされているかどうかを判断してから、適切な関数を呼び出します。

もう1つのオプションは、2つのライブラリを構築することです。1つはSSE4.2を使用し、もう1つは使用しないで、両方をアプリケーションバンドルに同梱しますが、リンクはしません。最初にロードされるときに、コードはSSE4.2がサポートされているかどうかを判断してから、適切なライブラリをロードします。

最初の方法を使用すると、ライブラリのロードとすべての関数の接続について心配する必要はありませんが、実行されない余分なコードを常にロードし、それらの各関数を呼び出す前に変数をチェックする必要があります。2番目の方法を使用すると、毎回何もチェックせずに関数を呼び出すことができますが、ライブラリをロードしてすべての関数を接続することは、変数を毎回比較するよりも手間がかかります。

于 2012-09-24T00:08:28.130 に答える