ライブラリについて解説!静的・動的とは?それぞれのメリットは?

このページでは、ライブラリについて解説します。ライブラリを使いこなせるとかなりプログラミングが楽になります。ぜひ活用していきましょう!

ライブラリ

まずはライブラリとは何か?ライブラリを使用するメリットについて解説していきます。

ライブラリとは

ライブラリとは、複数の機能(関数)を集めたものです。関数の記述された本がたくさんある本棚みたいなものをイメージするとわかりやすと思います。

下記ページでオブジェクトファイルの生成方法について記載していますが、ライブラリとは具体的に、このオブジェクトファイルをたくさん集めたものです。

C言語ソースコードが実行可能ファイルになるまでの流れ

ライブラリから外部公開されている関数は、その関数のプロトタイプ宣言とライブラリのリンクをしてやれば、プログラムから実行可能になります。

 

ライブラリのメリット

ライブラリを使いこなすことで、プログラミングが楽になります。

例えば下記ように複数のC言語ソースコードで、全く同じ関数を作成し、それを使用しているとします。

この同じ関数部分を切り出して新たなソースコードを作成し、これをライブラリ化しておきます。

これにより関数のプロトタイプ宣言さえしておけば、ライブラリにリンクすることで他のプログラムからも切り出した関数を実行することができます。もう同じ関数を作る必要がなくりソースコードを書く量を減らすことができ楽ができます。

ただし、いろんな関数を何も考えずにとにかく一つのライブラリにしてしまうとライブラリの容量が大きくなり、実行可能ファイルのサイズが大きくなってしまったり、プログラムの実行が遅くなったりしてしまうので、機能の種類毎などで分割してライブラリを作成する方が良いです(例えば数学関連のライブラリ・ファイル編集関連のライブラリ・文字列操作関連のライブラリ…など)。

ライブラリには二種類のライブラリがあります。静的ライブラリと動的ライブラリです。

静的ライブラリ

まず静的ライブラリについて解説します。

静的ライブラリとは

静的ライブラリとは、リンク時に実行可能ファイルに結合されるライブラリです。最初に関数を本にライブラリを図書館に例えましたが、静的ライブラリのリンクを例えれば、実行可能ファイルがその本全てを持たされるイメージです。

実行ファイルに静的ライブラリが結合されるのでファイルサイズとしては大きくなります。が、実行ファイルさえあればプログラム実行できるので、お手軽にプログラムの実行を行うことが可能です。

静的ライブラリの作り方

静的ライブラリは、オブジェクトファイルの生成とライブラリ化の2手順により作成することができます。

関数(main関数以外)を定義したソースコードの名前を func.c とした時、下記コマンドによりオブジェクトファイルを生成することができます。

gcc -c func.c

おそらく func.o という名前のオブジェクトファイルが生成されます。このオブジェクトファイルを下記のarコマンドによりライブラリ化することができます。

ar r libfunc.a func.o

libfunc.a は生成するライブラリの名前です。今回はオブジェクトファイルが一つの例ですが、複数のオブジェクトファイルを一つのライブラリにまとめることも可能です。

ar r libfunc.a func.o func2.o func3.o

静的ライブラリのリンクの仕方

ライブラリのリンクの仕方はいくつかの方法があります。

gcc main.c libfunc.a -o main.exe
gcc main.o libfunc.a -o main.exe
gcc main.c -lfunc -L . -o main.exe

main.o はmain.cをオブジェクトファイル化したものです。

最後のコマンドで出てくる -l[ライブラリ] は、lib[ライブラリ].a というライブラリファイルにリンクするオプションになります。このオプションが使えるので、ライブラリ名は libXXX.a という名前で生成した方が使い勝手が良いです。また -L オプションは指定したライブラリが存在するフォルダを指定します。

スポンサーリンク

動的ライブラリ

続いて動的ライブラリについて解説します。

動的ライブラリとは

動的ライブラリとは、リンク時にはリンクに必要な情報のみを実行ファイルに結合し、実際のリンクは実行時に結合されるライブラリです。共有ライブラリとも呼ばれます。

動的ライブラリは実行時に結合されるので、サイズファイルとしては静的ライブラリのリンク後実行ファイルと比べて小さくなります。しかし、動的ライブラリが実行ファイルからアクセスできる場所にないとプログラムの実行ができません。

動的ライブラリの作り方

オブジェクトファイルを生成するところまでは静的ライブラリと同じです。

ライブラリは下記のように gcc に -shared オプションを付加することで生成することができます。-o オプションの引数に渡した名前の動的ライブラリが生成されます。.so はおそらくShared Object の略だと思います。

gcc -shared func.o -o libfunc.so

動的ライブラリのリンクの仕方

実は静的ライブラリと同じ方法でリンクすることができます。

gcc main.c libfunc.so -o main.exe
gcc main.o libfunc.so -o main.exe
gcc main.c -lfunc -L . -o main.exe

ただし、静的ライブラリと異なって、動的ライブラリの場合は main.exe にライブラリの機能が結合されません。上記を行うとリンク関連の情報が結合され、それに従って main.exe 実行時に実際のリンクが行われます。

メリット

静的ライブラリと動的ライブラリのメリットについて解説します。

静的ライブラリのメリット

1つ目はプログラム実行のお手軽さです。静的ライブラリの場合は、リンク時に実行可能ファイルに必要な機能が組み込まれますので、実行可能ファイルひとつがあればプログラムが実行可能です。動的ライブラリの場合は、実行ファイルと動的ライブラリの両方がないと動作できないません。なので、他のPCに実行ファイルをさせる場合は動的ライブラリ側も一緒に移動させてやる必要がありますのでちょっと面倒です。

2つ目は起動の速さです。動的ライブラリの場合はプログラム起動時に必要なライブラリにリンクしますので、その分起動に時間がかかります。まあ大規模なライブラリでなければ気にならないとは思いますが…。

動的ライブラリのメリット

1つ目はプログラム変更のお手軽さです。動的ライブラリの場合はプログラム実行されるまでリンクされません。ですので動的ライブラリ側もしくはライブラリ使用側のプログラム側を変更したとしてもリンクし直す必要はありません。なのでプログラムの修正はしやすいです。静的ライブラリの場合は、どちらか一方を修正した場合は必ずリンクし直す必要があります。ただし、動的ライブラリの場合でも、関数のIF(引数や戻り値の型)を変更した場合はリンクし直す必要があるので注意は必要です。

2つ目は実行可能ファイルのサイズです。動的ライブラリの場合はリンク時にライブラリそのものを結合しないため、実行可能ファイルのサイズは小さくなります。ですので、同じライブラリをたくさんのプログラムから参照するような場合だと特に、動的ライブラリの方がディスクの圧迫を防ぐことができます。

まとめ

機能を切り出してライブラリ化することでプログラミング楽になります。また他の人の作成したライブラリをリンクすることで、作成できるプログラムの幅を広げることもできます。

ライブラリには静的ライブラリと動的ライブラリの2つがありますので、自分の環境やプログラムに合ったライブラリを使用するようにしましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です