« Intel 版 MacOS X | トップページ | Apple Store が仙台にも!! »

Xcode 2.1 でユニバーサルバイナリを作ってみる(コマンドライン版)

さっそく Xcode 2.1 をダウンロードしたので、ユニバーサルバイナリを作ってみました。Xcode の GUI を使った方法については MYCOM PC WEB に載っているので、コマンドラインで試してみました。

これが、なかなかくせ者で、

1. 各プラットフォーム毎のオブジェクトファイルを生成
2. 各プラットフォーム毎に link し、バイナリを生成
3. 各プラットフォーム毎のバイナリをファットバイナリへ統合

と手順を踏まないと作成できませんでした。Makefile を書けば済むのでしょうけども、もっと簡単な方法はないのかな? しかし、コマンドラインで作成すると Xcode(GUI) では作成できない

- PowerPC(32bit)
- PowerPC(64bit)
- Intel(i386)

の 3 アーキテクチャのユニバーサルバイナリが作成することができました。


■Hello World のプログラムを作成(hello.c)
% cat hello.c
#include

int main(){
printf("hello¥n");

return 0;
}


■各オブジェクトファイルを作成(obj_i386.o, obj_ppc.o, obj_ppc64.o)
% cc -o obj_i386.o -arch i386 -c hello.c
% cc -o obj_ppc.o -arch ppc -c hello.c
% cc -o obj_ppc64.o -arch ppc64 -c hello.c


■リンカーでバイナリを生成(hello_i386, hello_ppc, hello_ppc64)
% cc -o hello_i386 obj_i386.o -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk

% cc -o hello_ppc obj_ppc.o -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk

% cc -o hello_ppc64 obj_ppc64.o -arch ppc64 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk

この時点で、既に各アーキテクチャ毎のバイナリがそれぞれ出来上がっているので

% ./hello_ppc
hello

と実行できます。もちろん、対応していないアーキテクチャのバイナリを実行しても

% ./hello_i386
bash: ./hello_i386: cannot execute binary file

% ./hello_ppc64
bash: ./hello_ppc64: Bad CPU type in executable

と怒られます。


■ユニバーサルバイナリに統合(hello)
% /usr/bin/lipo -create hello_i386 hello_ppc hello_ppc64 -output hello

% file hello
hello: Mach-O fat file with 3 architectures
hello (for architecture i386): Mach-O executable i386
hello (for architecture ppc): Mach-O executable ppc
hello (for architecture ppc64): Mach-O 64-bit executable ppc64

このバイナリを実行すると、現在の実行環境である ppc が実行され

% ./hello
hello

となるようです。おもしれー


【6/10 追記】
下記のように、-arch を並べれば、こんなめんどい事しないで一行でできました。

% cc -o hello -arch ppc -arch ppc64 -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk hello.c

% file hello
hello: Mach-O fat file with 3 architectures
hello (for architecture ppc): Mach-O executable ppc
hello (for architecture ppc64): Mach-O 64-bit executable ppc64
hello (for architecture i386): Mach-O executable i386

|

« Intel 版 MacOS X | トップページ | Apple Store が仙台にも!! »

「Mac」カテゴリの記事

コメント

TBありがとうございます。
早速チャレンジとは恐れ入ります(^_^)
WWDCの内容を見るとXcode 2.1で書かれていれば
ボタン一発でコンパイル出来るといっていたようですが
そのように簡単に移行出来るものなのでしょうか?
私はプログラミングの知識は全くないのですが
それからXcode 2.1 ってコードウォリアーに比べると
少し難しい(?)という話を聞いた事があります。

投稿: KYO | 2005年6月10日 (金) 07時12分

KYO さん、コメントありがとうございます。

確かに Xcode を使うと、ボタン一発というか、チェックボックスを On にするだけで、簡単に Intel 版もコンパイルできます。Universal Binary Programming Guidelines を読んでみましたが、やはりエンディアンの違いや 0 除算など、CPU のハマり所に気をつけないとちゃんと動かないでしょうね。

あとは AltiVec(Velocity Engine) に最適化していたプログラムは Pentium の MMX/SSE に書き換えないと動きませんから、これが一番難しいところだと思います。

また、私はコードウォリアーは使ったこと無いので、比較できませんが、Xcode はそんなに難しいとは思いませんでしたよ。

投稿: ひできち | 2005年6月10日 (金) 11時11分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/166812/8634112

この記事へのトラックバック一覧です: Xcode 2.1 でユニバーサルバイナリを作ってみる(コマンドライン版):

« Intel 版 MacOS X | トップページ | Apple Store が仙台にも!! »