静的ライブラリと共有ライブラリ
Windows
静的ライブラリはコンパイラ依存で COFF, OMF, ELF の乱立。 共有ライブラリは PE/COFF の dll だけ。 Unix との大きな違いとして、エクスポートするシンボルを 指定しないといけないということがある。
.lib はオブジェクトフォーマットの違いを抜きにしても 2 種類あり、インポートライブラリは .dll へのスタブを提供するもので、 普通の静的ライブラリも同じ拡張子を使うのでややこしい。
.dll をリンクしたい場合は implib や impdef で シンボル一覧を取れたりする。 .obj 群から dll 作るのはツールチェーン依存で、 GCC 以外は IDE が無いと大変だったり、 GCC でも大変だったり。
Cygwin/MinGW
基本的に Unix みたいな流儀で .o と .a と .la ができてて、 dll が bin の下に入るのだけが違う。 dll を作る時に dlltools と dllwrap とかを 使って dll を作る。 (TODO: オプションとか)
Cygwin では -mno-cygwin を使って MinGW のランタイムとリンクしないと 他の環境でも cygwin1.dll が必要になるので注意。
Borland, Digitalmars
Borland の implib, impdef が便利。 あと tlib とか tdump も普通に便利。 Digitalmars のツール群はオプション体系がわかりにくいのでひどい。
とりあえず .dll をリンクしたい時は、
implib -a -c hoge.lib hoge.dll
として、これでできた hoge.lib をリンクすると良い。 Digitalmars だと
implib /system hoge.lib hoge.dll
あと、 kernel32.dll とか opengl32.dll とかは この方法でリンクできなかったと思う。 (TODO: その理由)
VC
昔色々調べたけど忘れた。 (TODO: 思い出す)
とりあえず IDE があると良い。
MacOSX
Mach-O 一色。基本的に GCC が使えれば Unix 的に使うことは問題なくできる。 .so が .dylib だけど。
で、 Unix ぽい共有ライブラリや実行ファイルもあるけど、 .app や .framework という拡張子のついた ディレクトリで構成される物体 (NeXT由来なのかしら) もある。
.app は中のぞくと hoge.app/Contents/MacOS の中に実行ファイルがある。 Contents/Framework の下に .framework を置くことで dll と一緒に配布みたいなことができる。 他もだいたい既存の .app の中身を見て構成を真似れば CUI でも作れる。
.framework をリンクする時は -F でパスを指定して、 -framework でリンクすること。 例えば
gcc -F$HOME/Frameworks -framework SDL
など。 つまり MacOSX の gcc や ld は MacOSX 独自拡張がされている。
あと .a は mv しただけで使えなくなるので ranlib しましょう。
dlopen から使用するものは bundle と呼ばれ、 MacOSX では厳密に区別される。
http://www.finkproject.org/doc/porting/shared.php?phpLang=ja
静的ライブラリのリンクに関して
Windows とか MacOSX では、 なんでか知らないけど ld が静的ライブラリ間の依存関係を きちんと把握してくれていないので、 自分で依存順にリンクする必要があったりする。 たいていの場合は何度も指定すればなんとかなる。
gcc -o a.out foo.a bar.a foo.a
などという。 たまに gcc -v で ld のオプションを吐かせて、 その順序をいじらなければならない場合もあったりなかったり。
Keyword(s):
References:[PortableBinaryHacks]