(2006/09/10 記)
./configure; make
でビルドするフリーソフトを Mac OS 10.4 で改造していたのだが、古いバージョンでも動くバイナリを作ろうと思って SDK を使ったクロスコンパイルにとりかかったら、ハマってしまった。解決してしまえば非常に簡単だったのだが、たぶんすぐにまた忘れてしまうのでメモ。
なお、以下の手順は、普通のコマンドラインツールをビルドする時のもので、Core Foundation とか Carbon とかを使うときどうなるかは確かめていません。念のため。
SDK を使うためには、gcc (4.0) にオプション -isysroot /PATH/TO/SDK
を与えればいいのだが、Xcode 2.1 に付属の gcc-4.0 だとうまくいかないことがある。2.4 に上げてしまえば大丈夫。
export CFLAGS="-isysroot /Developer/SDKs/MacOSX10.3.9.sdk" ./configure make
参考:pass -isysroot to linker on darwin。Xcode 2.1 付属の gcc-4.0 ではリンク時に -Wl,-syslibroot,/PATH/TO/SDK
が必要だったのだが、これと -isysroot /PATH/TO/SDK
を同時に与えるとリンク時に syslibroot: multiply specified
というエラーになってしまう。
10.2.8 SDK は gcc 3.3 を使わないといけない(これに気づくのに半日かかった)。次のようにする。
export CC=gcc-3.3 export NEXT_ROOT=/Developer/SDKs/MacOSX10.2.8.sdk export C_INCLUDE_PATH=$NEXT_ROOT/usr/include ./configure make
できあがった実行形式のバイナリがどのダイナミックライブラリをリンクしているかは、otool
を使って調べることができる。
$ otool -L xxx_for_10_4 xxx_for_10_4: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.1.6) $ otool -L xxx_for_10_3 xxx_for_10_3: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 71.1.3) $ otool -L xxx_for_10_2 xxx_for_10_2: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 63.0.0)
2. で C_INCLUDE_PATH
を指定するのはいいのだが、このパスにヘッダファイルがないと /usr/local/include
とか /usr/include
を見に行っちゃうみたい。これは問題を起こすことがあるかもしれない。
$ export NEXT_ROOT=/Developer/SDKs/MacOSX10.2.8.sdk $ export C_INCLUDE_PATH=$NEXT_ROOT/usr/include $ gcc-3.3 -v resolvtest.c ...(snip)... #include "..." search starts here: #include <...> search starts here: /Developer/SDKs/MacOSX10.2.8.sdk/usr/include /usr/local/include /usr/include/gcc/darwin/3.3 /usr/include End of search list. ...(snip)...
1. だとそうはならず、-isysroot
で指定したディレクトリの中でちゃんと閉じてくれる。
$ gcc-4.0 -v -isysroot /Developer/SDKs/MacOSX10.3.9.sdk resolvtest.c ...(snip)... #include "..." search starts here: #include <...> search starts here: /Developer/SDKs/MacOSX10.3.9.sdk/usr/lib/gcc/powerpc-apple-darwin8/4.0.1/include /Developer/SDKs/MacOSX10.3.9.sdk/usr/include /Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks /Developer/SDKs/MacOSX10.3.9.sdk/Library/Frameworks End of search list. ...(snip)...