2019年3月4日月曜日

ライブラリの使い方(静的リンクと2種類の動的リンク)について

こんにちは、ふじかーです。

先日現場で ライブラリのリンク方法 が話題に上がりました。

「提供いただいたライブラリが実行時に見つからず起動失敗してるようです」
「ライブラリのどの機能が呼ばれた時にエラーになってるんですかね?」
「いや、プログラム起動時にライブラリが見つからないので起動失敗してますね」
「あら、動的リンクですよね?APIコール時に探しに行くんじゃないんですか?」
「動的ですけど、リンクは起動時ですね」

ライブラリのリンク方法について説明するのにちょっと調べたので
確認した内容を整理しました。


ライブラリ


ライブラリとはご存知の通り、
 汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの(by Wikipedia)
 → ある機能を、ほかのプログラムから使用できるように部品化したファイル
といった物ですが

ライブラリは、それ自体が単独で実行されることはなく
自前プログラムからライブラリを結合して呼び出してやる必要があり、

その結合方法として
 1.静的リンク
 2.動的リンク
 3.動的ロード
があります。

1.は解りやすいんですが、
今回の会話では2.と3.がごっちゃになっていたようです。



静的リンク


プログラムのビルド時にライブラリを結合させて、
実行ファイルを作成する方法。

ライブラリは「静的ライブラリ」として自前プログラムの中に取り込まれる。
Windowsでは拡張子「.lib」、Linuxでは拡張子「.a」のファイルとなっている。

ファイルが見つからない場合、ビルドエラーとなる。




動的リンク


自前プログラムを起動させる時(メモリ上にロードする時)に、
ライブラリを結合する方法。
「起動時リンク」等と表現しているところもある。

この場合のライブラリは「動的ライブラリ」として
自前プログラムから見える(パスの通った)位置に格納しておく必要がある。
Windowsでは拡張子「.dll」、Linuxでは拡張子「.so」のファイルとなっている。

ファイルが見つからない場合、自前プログラムの起動に失敗する。




動的ロード


実行中の自前プログラムで、ライブラリの機能を使いたいタイミングで結合する方法。
「動的読み込み」「実行時リンク」等と表現しているところもある。

これも「動的リンク」の一部であり、上のと同じく
拡張子「.dll」「.so」のファイルが使用される。

自前プログラムのなかで「ライブラリ機能を使いたいタイミング」でパス指定するので
使いたい時にファイルが見つからなければ実行時エラーとなる。


また動的リンクでは
ライブラリで提供される関数をそのままコールすれば使えるんですが

動的ロードはそうはいかず
dlopen/dlsymでロード/ポインタ管理する必要があるなど
手間が増える方向になります。

用途としては
・プログラムにとって主要で外せない機能 → 動的リンク(起動時リンク)
・プログラムにとって無くても困らない機能 → 動的ロード(実行時リンク)
とするのが一般的なようです。


0 件のコメント:

コメントを投稿