iOS ユニバーサル アプリケーションに統合しようとしているサード パーティの API があります。API は、デバイスで実行すると正常に動作しますが、シミュレーターで実行しようとすると、コンパイル時にリンク エラーが発生します。シミュレーターで実行する場合、静的ライブラリのリンクをスキップする方法はありますか?
ありがとう
実際、思ったよりずっと簡単です。
-ObjC
ステップ 1: リンカー フラグを-all_load
ターゲットに追加します。これにより、objc ランタイムは、コードでクラスを参照しなくても、クラスをメモリにロードするようになります。
ステップ 2: コードでは、次のことができます。
Class cls = NSClassFromString(@"SomeClassInStaticLibrary");
if (cls == nil)
{
// on the simulator
}
else
{
// on the device, use the class like usual
id myInstance = [[cls alloc] init];
}
id
残念ながら、ヘッダーを含めるとリンカー エラーが発生するため、すべてを として参照する必要があります。
ちょっとしたハックですが、うまくいきます。
この設定は、ターゲットの Xcode (4.3) ビルド設定タブで制御できます。「その他のリンカーフラグ」について説明している場合は、条件付き設定を追加できます(デフォルトで「ビルド設定の追加」と表示されている右下の「+」アイコンをクリックして押したままにします)。ここでは、通常の -l/-L リンカー フラグを使用してリンクするライブラリを指定できますが、「任意の iOS SDK」として指定されたビルドに対してのみですが、「任意の iOS シミュレータ SDK」にはこのフラグを追加しないでください。
できることは、静的ライブラリをFAT
1 つとしてビルドすることです。armv と i386 の両方のアーキテクチャーをシミュレーターで実行するためのコンパイル。
詳細については、こちらをご覧ください。
http://mark.aufflick.com/blog/2010/11/18/make-a-fat-static-library-for-ios-device-and-simulator