さっそく 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
最近のコメント