ライブラリのリンク方法をきっちり区別しよう

初めに

ライブラリのリンク方法は3種類に分けられます。
「動的ライブラリ」や「動的リンク」といったキーワードでネット検索すると、3種類全てを説明しているサイトがかなり少ない印象を受けます。
そこで「ライブラリのリンク方法」、という切り口で整理してみます。
OSの対象は、WindowsとLinuxです。Max OSは調べていませんが、恐らくライブラリに関しては、Linuxと同様の見方で大丈夫です。(フォーマットの違い等、細かいことは、本記事では対象外です)

3種類のリンク方法

No リンク方法 対象ライブラリ Windowsにおける拡張子 Linuxにおける拡張子 リンクタイミング
1 静的リンク 静的ライブラリ(スタティックライブラリ) lib a ビルド時
2 動的リンク 動的ライブラリ(ダイナミックライブラリ、共有ライブラリ) dll so 実行ファイルを実行する時
3 動的ロード 動的ライブラリ(ダイナミックライブラリ、共有ライブラリ) dll so プログラムが任意にライブラリをロードした時

拡張子「dll」はDynamic Link Libraryの略、拡張子「so」はShared Objectです。
あれ、共有ライブラリ=Shard Libraryならslでは?というつっこみはなしの方向で。。。

静的ライブラリと動的ライブラリを区別できる人は多いと思いますが、2と3を区別できる人は少ないのではないでしょうか。
1と2、または、1と3の組み合わせのみを解説しているサイトがやたらと多いです。。。

動的リンク

2の「動的リンク」は、Makefileに「-l」でライブラリ名を指定してビルドすると、実行ファイルを実行する時に、OSが指定したライブラリを決められた検索順番でディレクトリを検索し、ライブラリが見つかるとリンクします。
全ての検索パスを検索して見つからない時は、実行エラーになります。

動的ロード

3の「動的ロード」は、WindowsならLoadLibrary()関数、Linuxならdlopen()関数でライブラリをロードした時に、初めてライブラリの内容がメモリにロードされます。Makefileに「-l」で指定する必要はありません。(その代わり、「-fPIC」や「-shared」が必要です)
動的ロードする為のデフォルトのルールには、クラスのインスタンスを作成して読み出す、というAPIはありません。
従って、クラスのインスタンスを作成して読み出す為には、extern C{}で括った領域に、クラスをnewしてインスタンスを返すような関数をプログラマが独自に定義する必要があります。
この「独自に定義」する部分のルールを、よりしっかり作ったものが「プラグイン」と呼ばれるものです。
WebブラウザやIDEのプラグインのように、後から機能を追加できる仕組みです。
プラグインは動的ロードの1種といってよいと思います。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.