photo © 2008 Jason McHuff | more info (via: Wylio)
iOS Static Libraries
iOS Static LibrariesというiOSアプリ向けにビルドされた便利ライブラリ群があります。
ちょっと必要なライブラリが含まれていて、自分でビルドするよりも便利ですし、iOS SDKがバージョンアップされたらきちんと更新されているので便利に使わせてもらっています。
先日、iOS Static Librariesの、iOS SDK 4.3向けのビルドがリリースされました。
しかし、これがちょっと曲者で、現在iOSデバイスはARM V6かARM V7の二つがあり、今回のビルドバーションは、ARMアーキテクチャ向けに二つのビルドがなされているのです。
ARM V6というのはiPhone 3G以前で使われていたものなので、対応機種を3GS以降に絞るならARM V7のみに対応したビルドを行えばいいのですが、まだ3Gも無視できない状況ですので、これをなんとかしないといけません。
そして、Xcodeのビルド設定的には一つにマージされている方が便利なのです。
マージって、、なんかツールがあるのか?設定でどうにか回避できるものなのか?と調べてみたところ、偶然、lipoというコマンドを知ることが出来ました。
lipoコマンド
man lipoによると、次のような説明があります。
The lipo command creates or operates on “universal” (multi-architecture) files.
まさに複数アーキテクチャ対応のユニバーサルファイルを生成するためのツールだと分かります。
そして、これはiOSアプリを開発できる環境ならインストール済みであることも分かりました。
例として、前述したiOS Static Librariesについて調べてみます。
ARM V6用のライブラリ libcurl.a について下記のコマンドで調べてみます。すると、ちゃんとターゲットアーキテクチャを調べることが出来ることが分かります。
1
2
3
| $ lipo -info libcurl.a
input file libcurl.a is not a fat file
Non-fat file: libcurl.a is architecture: armv6 |
$ lipo -info libcurl.a
input file libcurl.a is not a fat file
Non-fat file: libcurl.a is architecture: armv6
そして、ユニバーサルファイルを作る例ですが、例えば、ARM V6用、V7用のlibcurl.aが、./armv6/libcurl.a と、 ./armv7/libcurl.a にある場合には、次のようにして生成できます。出力先は ./fat/ とします。
1
| lipo -arch armv6 ./armv6/libcurl.a -arch armv7 ./armv7/libcurl.a -create -output ./fat/libcurl.a |
lipo -arch armv6 ./armv6/libcurl.a -arch armv7 ./armv7/libcurl.a -create -output ./fat/libcurl.a
直感的でわかりやすいですね!
armv6/armv7ユニバーサルライブラリをつくる
というわけで、今回の目標である「iOS Static Librariesのarmv6/armv7ユニバーサルライブラリをつくる」シェルスクリプトを載せておきます。
まず、準備として次のようなファイル配置にしておきます。

workディレクトリ直下で実行したら、work/lib以下にユニバーサルライブラリファイルが生成されると思います。また、処理対象は”*.a”ファイルのみ、とします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| #!/bin/bash
echo 'makefat.sh -- start!'
RootV6='./iPhoneOS-V6-4.3'
for lib_armv6 in `find $RootV6 -name "*.a" -print`
do
lib_armv7=`echo $lib_armv6 | sed "s/V6/V7/g"`
echo $lib_armv6
echo $lib_armv7
lib_fat=`echo $lib_armv6 | sed "s/iPhoneOS-V6-4.3\///g"`
echo $lib_fat
lipo -arch armv6 $lib_armv6 -arch armv7 $lib_armv7 -create -output $lib_fat
done
echo 'makefat.sh -- end!' |
#!/bin/bash
echo 'makefat.sh -- start!'
RootV6='./iPhoneOS-V6-4.3'
for lib_armv6 in `find $RootV6 -name "*.a" -print`
do
lib_armv7=`echo $lib_armv6 | sed "s/V6/V7/g"`
echo $lib_armv6
echo $lib_armv7
lib_fat=`echo $lib_armv6 | sed "s/iPhoneOS-V6-4.3\///g"`
echo $lib_fat
lipo -arch armv6 $lib_armv6 -arch armv7 $lib_armv7 -create -output $lib_fat
done
echo 'makefat.sh -- end!'
one more lipo
lipoは複数アーキテクチャのユニバーサルライブラリをから特定のアーキテクチャパートを削除することも出来たりするようです。
両方対応版のライブラリのみが提供されている環境で、不要なアーキテクチャを削除すれば、ビルド後の実行ファイルサイズが小さくなったりすると思うので、そういう用途にも使えそうですね。
[AD]
↓リンカーとかプログラムをきっちりやろうとしたら外せない部分。去年出たらしいこの本、面白そうですね。
アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。
↓もうすぐ発売されるWEB+DB PRESS plusシリーズ。気になるタイトルです!!
アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。
↓こういうのじっくり読んでみたいなぁ〜。
アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。
↓結局まだ読んでいない数学ガールシリーズ最新作はアルゴリズムへ突入!
アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。