はじめに
初めまして、42TokyoでC言語を学んでいる学生です。静的ライブラリと動的ライブラリってどういう違いがあるの?それぞれどんなメリットがあるの?という質問に答えられなかったので、調べました。
静的ライブラリと動的ライブラリの違い
静的ライブラリ
・コンパイル時に実行ファイルに組み込まれるライブラリ
・実行ファイルが単体で動作可能
・通常lib*.aという形式で命名される。
メリット:
・実行時に外部のライブラリを必要としないため、環境に依存しにくい。
・実行速度が速い傾向
デメリット:
・実行ファイルのサイズが大きくなる。
・ライブラリを更新したい場合、実行ファイル自体を再コンパイルしなければならない。
・複数のプログラムで同じライブラリを使用する場合、各実行ファイルに同じコードが重複して含まれてしまう。
動的ライブラリ
・実行時にOSによってロードされるライブラリ
・実行ファイルは、動的ライブラリへの参照を含んだ状態
・lib*.so (Linux) や lib*.dylib (macOS) といった形式で命名される。
メリット:
・実行ファイルのサイズが小さい。
・ライブラリを更新する場合、実行ファイルを再コンパイルせずに、動的ライブラリファイルを置き換えるだけで済む。
・複数のプログラムで同じ動的ライブラリを共有できるため、ディスク容量を節約できる。
デメリット:
・実行時に動的ライブラリが見つからないと、プログラムが正常に動作しない。
・静的ライブラリに比べて、実行時にわずかにオーバーヘッドが発生する可能性がある。
静的ライブラリと動的ライブラリのどちらを選ぶべきか
静的ライブラリを選ぶ場合:
・特定の環境でしか動作しないプログラム
・実行速度を優先したいプログラム
・ライブラリを頻繁に更新しないプログラム
動的ライブラリを選ぶ場合:
・複数のプログラムで共有したいライブラリ
・ライブラリを頻繁に更新する可能性があるプログラム
・実行ファイルのサイズを小さくしたいプログラム
静的ライブラリと動的ライブラリの作り方
静的ライブラリの作成
1.オブジェクトのファイル作成
my_function.cというソースファイルをコンパイルし、オブジェクトファイルmy_function.oを作成します。
gcc -c my_function.c -o my_function.o
2.オブジェクトのファイル作成
my_function.oをアーカイブし、静的ライブラリlibmylib.aを作成する。arはアーカイブを作成するコマンドで、rcsオプションは、ライブラリを作成し、既存のメンバーを置き換えることを意味する。
ar rcs libmylib.a my_function.o
3.プログラムへのリンク
main.cをコンパイルし、libmylib.aをリンクして実行ファイルmainを作成する。-L.オプションは、カレントディレクトリをライブラリ検索パスに追加し、-lmylibオプションは、libmylib.aをリンクすることを意味する。
gcc main.c -L. -lmylib -o main
動的ライブラリの作成
1.オブジェクトのファイル作成
my_function.cというソースファイルをコンパイルし、オブジェクトファイルmy_function.oを作成します。
gcc -c my_function.c -o my_function.o
2.動的ライブラリの作成
my_function.oを共有ライブラリlibmylib.soとして作成する。-sharedオプションは、共有ライブラリを作成することを指定し、-fPICオプションは、位置非依存コードを生成するためのオプションとなる。
gcc -shared -fPIC my_function.o -o libmylib.so
3.プログラムへのリンク
gcc main.c -L. -lmylib -o main
# 余談
C言語でprintf関数を使う時に記述する
#include <stdio.h>
動的ライブラリ?が読み込まれている?それとも静的ライブラリ?が読み込まれている?と疑問に思い、調べてみたら、通常動的ライブラリが読み込まれているみたいですね。
解釈が間違っていたので、削除いたしました。2024/10/11 21:30