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対応が終わりです。もうちょっとで完了だ。
まず、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対応が終わりです。もうちょっとで完了だ。