Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

はじめてのひき - 静的ライブラリと共有ライブラリ Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

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