2016-04-19 12 views
0

iOSアプリケーションを1つ以上のスタティックライブラリにリンクするときに解決できなかった問題があります。iOSアプリケーションに静的ライブラリのすべてのシンボルが含まれています

私はいくつかの静的ライブラリ(MACH-Oタイプ:リロケータブルオブジェクトファイル)を作成しており、それぞれには多数のシンボルが含まれています。これらの静的ライブラリはそれぞれ、FATライブラリであり、各iOS/Simulatorアーキテクチャのスライスを含んでいます。私の理解から、私がiOSアプリケーションをコンパイルするとき、私のアプリケーションで使われているシンボルだけがコンパイルされ、私のアプリケーションに含まれていなければならないが、すべてのシンボルが含まれている。

私はいくつかのコマンドotoolを使用してテスト、NM、および他のツールをやったと私はライブラリのコードのいずれかを呼び出していない場合でも、これらのライブラリのいずれかにリンクする際いることがわかります、すべてのシンボルがアプリケーションにコンパイルされています。私のアプリケーションは42kBから3MB以上になります。

これはなぜ起こっているのですか?

答えて

0

Objective-Cは動的ランタイムです。例えば、

NSString *classToUse = ["MPViewController" stringByAppendingString:class]; 
return [[NSClassFromString(classToUse) alloc] init]; 

を...さらに、これはあなたがNIBをロードするときに発生多かれ少なかれ正確に何である - 文字列クラスとプロパティ名がディスクからロードされ、バッキングクラスは、ランタイムおよびプロパティを経由して発見された:実行しますキー値コーディングによって適用されます。ダイナミックルックアップはエッジケースではありません。

したがって、リンカはObjective-C静的ライブラリからどのシンボルが使用されているかについては何も仮定することができません。 Cリンカー。

0

はい、スタティックライブラリを取り除くことで可能ですが、後処理が有効になっている場合は実行できます。 Xcodeのビルド設定 "Deployment Postprocessing"をyesに設定します。 (DEPLOYMENT_POSTPROCESSING = YES)。また、「別のストリップを使用する」が「はい」に設定されていることを確認してください。ビルド設定にNOとライブラリ、設定されたデバッグシンボルを作成している間あなたは* this

また、あなたは動的ライブラリを使用して期待しているものを達成することができますが、非常に素晴らしい記事here

エクストラヒント あり確認することができます。これにより、静的ライブラリのサイズを最大30%まで縮小できます。

+0

問題は静的ライブラリ(他のライブラリとリンクする必要がある)にたくさんのシンボルがあるということではなく、すべてのシンボルが私のアプリケーションに含まれているということだけです。 たとえば、2つの静的ライブラリ_lib1_と_lib2_があります。 _lib1_で使用されている_gsym_など、グローバルシンボルをエクスポートします_lib1_でアプリケーションをリンクすると(コードを呼び出さないでください)、_gsym_はアプリケーションで使用されず、_lib2_で間接的に使用されるため、しかし、私の最終的なアプリケーションには含まれていますが、これは私が経験している問題です。 他の提案はありますか? – CocoaTouchGuru

関連する問題