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

このページにはプロモーションが含まれています

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

ライブラリ

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

ライブラリとは

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

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

【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つがありますので、自分の環境やプログラムに合ったライブラリを使用するようにしましょう。

オススメの参考書(PR)

C言語学習中だけど分からないことが多くて挫折しそう...という方には、下記の「スッキリわかるC言語入門」がオススメです!

まず学習を進める上で、参考書は2冊持っておくことをオススメします。この理由は下記の2つです。

  • 参考書によって、解説の仕方は異なる
  • 読み手によって、理解しやすい解説の仕方は異なる

ある人の説明聞いても理解できなかったけど、他の人からちょっと違った観点での説明を聞いて「あー、そういうことね!」って簡単に理解できた経験をお持ちの方も多いのではないでしょうか?

それと同じで、1冊の参考書を読んで理解できない事も、他の参考書とは異なる内容の解説を読むことで理解できる可能性があります。

なので、参考書は2冊持っておいた方が学習時に挫折しにくいというのが私の考えです。

特に上記の「スッキリわかるC言語入門」は、他の参考書とは違った切り口での解説が豊富で、他の参考書で理解できなかった内容に対して違った観点での解説を読むことができ、オススメです。題名の通り「なぜそうなるのか?」がスッキリ理解できるような解説内容にもなっており、C言語入門書としてもかなり分かりやすい参考書だと思います。

もちろんネット等でも色んな観点からの解説を読むことが出来ますので、分からない点は別の人・別の参考書の解説を読んで解決していきましょう!もちろん私のサイトも参考にしていただけると嬉しいです!

入門用のオススメ参考書は下記ページでも紹介していますので、こちらも是非参考にしていただければと思います。

https://daeudaeu.com/c_reference_book/

同じカテゴリのページ一覧を表示