2011-01-02 8 views
26

私はiPhoneスタティックライブラリ(a * .aファイル)のセットをいくつか呼び出します。 私は過去に(Linuxのライブラリを使って)ARを使って静的ライブラリからオブジェクトファイルを抽出し、不要なオブジェクトファイルを削除して再アーカイブしました。私は静的ライブラリをcompliled iPhoneでこれをしようとすると、iPhoneスタティックライブラリからオブジェクト(* .o)ファイルを抽出する

はしかし、私は次のエラーを取得する:

ar: CustomiPhoneLib.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it) 
ar: CustomiPhoneLib.a: Inappropriate file type or format 

は、静的ライブラリをコンパイルしたiphoneからオブジェクトファイルを抽出する方法を誰もが知っていますか? thieを実行すると、最終的なファイルサイズが減少する可能性があります。

答えて

40

これは、CustomiPhoneLib.aがファットライブラリ、つまりiOS上に複数のターゲットアーキテクチャ(armv6とarmv7)を含むライブラリであるためです。 lipoを使用して別の.aファイルに特定のアーキテクチャを抽出し、arranlibを自由に操作してからlipoを再度使用して、操作された.aファイルを単一の.aファイルに再結合できます。たとえば、

lipo CustomiPhoneLib.a -thin armv6 -output CustomiPhoneLibarmv6.a 
lipo CustomiPhoneLib.a -thin armv7 -output CustomiPhoneLibarmv7.a 
### use ar and ranlib at will on both files 
mv CustomiPhoneLib.a CustomiPhoneLib.a.original 
lipo CustomiPhoneLibarmv6.a CustomiPhoneLibarmv7.a -create -output CustomiPhoneLib.a 

ただし、あなたが言及した理由でこれを行う必要はありません。リンカは、シンボル参照を解決する必要がある場合にのみ、オブジェクト(.o)ファイルをライブラリ(.a)から取得します。したがって、ライブラリーが、リンク処理中にシンボルが決して参照されないオブジェクトファイル(すなわち、効果的に使用されていないシンボル)を含む場合、そのオブジェクトファイルは実行可能ファイルには入れない。

+1

これは私が探していた正確な説明です!ありがとうございました!私はGoogleのようなものを見つけることができなかった。 – Brett

+0

@Bavarious:Objective-Cは動的言語であり、リンカはどのクラスとカテゴリが使用されているかを常に知ることはできないので、lib内の不要なオブジェクトを削除することはOKです。 –

3

Code: ar -t mylib.a これは、アーカイブ内のすべてのファイルを一覧表示します。

Code: AR -xv mylib.a myobj.o これは、ライブラリmylib.aからmyobj.oを与えるオブジェクトを抽出します。

+3

これはfatバイナリでは機能しません。 – fpg1503

+0

脂肪のバイナリにはどのような効果がありますか? – davidhq

+0

最初に抽出しなければならなかったのは、 'lipo -thin x86_64 libtag.a -output libtag2.a'、その後' ar tv libtag2.a'が働いた – davidhq

関連する問題