TechNote by 古賀信哉

技術情報のメモ書き(備忘録)

Mac OS Xでビルド

2005-05-12 18:20:29 | 移植性
AVIライブラリを、Mac OS Xでビルドしてみたら、まずはコンパイルエラー。big endianな環境での動作確認をするためだったのですが、コンパイラのpredefined macroでLinuxとWin32にしか対応していなかったので、追加作業が必要でした。

まず、Mac OS X/Darwin用gccのpredefined macroが何か分からなかったのですが、Appleのサイトで検索したところ、一覧がありました。ここの"Predefined Macros"の説明によれば、Mac OS X用のコード部分を指定するには、
 #if defined(__APPLE__) && defined(__MACH__)
 ...
 #endif
としてやるのが正しいようです。

次は、リンクオプション。DLL/shared libraryをビルドして使うのは、XCodeでは既にやってあったのですが、Makefile&makeでは試していなかったので、再びdeveloper.apple.comで検索。Linuxだと-sharedオプションを使えますが、Mac OS Xではサポートされていないので、-dynamiclibオプションに切り替える必要があります。この時点でめんどくさくなり(だって、あくまでもbig endian対応のテスト用だもん)、Mac OS X用のMakefileは、Makefile.macosxという別名にしました。

さらに、DLL/shared libraryの拡張子は、.soじゃなく、.dylibにしないといけません。ここに至って、Mac OS Xの実行ファイルフォーマットがELFじゃないことを思い出しました。Mac OS Xにおいて、Classic Mac OSがPowerPC対応した際にCFMと共に導入されたPEFを使わず、NeXTStep時代から引きずってきた、Mach-Oを採用したのでした。ちと気になって、"Linkers & Loaders"を見てみましたが、PEFもMach-Oも、載ってません。どちらもマイノリティなのですね;-)

閑話休題。ビルドの話は、まだ残る。DLL/shared library(Mac OS Xの用語だと、dynamic libraryになるようです)をリンクしたプログラムを動かす際の環境変数は、DYLD_LIBRARY_PATHです。setenvで、こいつにパスを突っ込んでやって、ようやく動かすことができました。残りは、AVIファイル中の整数値をバイトスワップ(エンディアン変換)する追加コードを書けば、ライブラリのbig endian対応が終わりです。もうちょっとで完了だ。