Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

静的ライブラリと共有ライブラリ

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 のオプションを吐かせて、 その順序をいじらなければならない場合もあったりなかったり。

Last modified:2008/08/15 12:53:56
Keyword(s):
References:[PortableBinaryHacks]