Create
Edit
Diff
FrontPage
Index
Search
Changes
Login
はじめてのひき - 静的ライブラリと共有ライブラリ
Title
!! 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 のオプションを吐かせて、 その順序をいじらなければならない場合もあったりなかったり。
人生、宇宙、すべての答え+1
:
Keyword(s) (one keyword per line)
[静的ライブラリと共有ライブラリ]
See
TextFormattingRules
for formatting help.
See TextFormattingRules for formatting help.