静的ライブラリと共有ライブラリ
ライブラリをビルドしてリンクします。
「静的ライブラリと共有ライブラリ」はCoddyKit上の無料C Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
ライブラリとは
ライブラリとは、コンパイル済みのオブジェクトファイルをまとめたもので、毎回ソースを再コンパイルせずに複数のプログラムで再利用できます。
Cのライブラリには2種類あります。
- 静的ライブラリ(
.a):リンク時に実行ファイルへコピーされます - 共有ライブラリ(
.so):実行時にロードされます
オブジェクトファイルのビルド
どちらの種類も、まずオブジェクトファイルから始めます。通常どおり-cを指定してソースをコンパイルします。
これらの.oファイルが、アーカイバーやリンカーによってパッケージ化される素材になります。
gcc -c mathlib.c -o mathlib.o
gcc -c strlib.c -o strlib.o静的ライブラリの作成
arアーカイバーは、オブジェクトファイルを.aアーカイブにまとめます。慣例的な名前はlib<name>.aです。
フラグの意味は、rが挿入、cが必要に応じた作成、sがインデックスの書き込みです。
ar rcs libmymath.a mathlib.o strlib.o静的ライブラリのリンク
検索ディレクトリには-Lを、ライブラリ名には-lを指定してリンクします(libプレフィックスと.aサフィックスは省略します)。
必要なコードは実行ファイルにコピーされるため、実行ファイルは単独で動作します。
gcc main.c -L. -lmymath -o app静的リンクのトレードオフ
静的リンクはシンプルで自己完結しています。
- 実行ファイルがすべてを含むため、実行時の依存関係がありません
- ただし、各プログラムがコピーを保持するため、バイナリが大きくなります
- ライブラリのバグを修正した場合、それを使用しているすべてのプログラムを再リンクする必要があります
位置独立コード
共有ライブラリは任意のメモリアドレスにロードできるため、コードは位置独立でなければなりません。-fPICを指定してコンパイルします。
これにより、固定アドレスではなく相対アドレスを使うコードが生成されます。
gcc -fPIC -c mathlib.c -o mathlib.o
gcc -fPIC -c strlib.c -o strlib.o共有ライブラリの作成
-sharedを指定して.soをビルドします。慣例的な名前はlib<name>.soです。
静的アーカイブとは異なり、これはローダーが実行時にメモリへマッピングできる、実際にリンクされたオブジェクトです。
gcc -shared mathlib.o strlib.o -o libmymath.so共有ライブラリのリンク
リンク方法は静的ライブラリの場合と同じです。異なるのは、コードがコピーされず、参照だけが記録される点です。
実行ファイルは小さく保てますが、実行時にlibmymath.soを見つける必要があります。
gcc main.c -L. -lmymath -o app実行時にライブラリを見つける
起動時、動的ローダーは標準パスから.soを検索します。カレントディレクトリにあるライブラリは、その検索対象に含まれません。
テスト時は、LD_LIBRARY_PATH(Linux)を使ってローダーに検索先を指定します。
LD_LIBRARY_PATH=. ./app共有ライブラリのトレードオフ
共有ライブラリは、シンプルさと引き換えに柔軟性を得られます。
- メモリ上の1つのコピーを複数のプログラムで共有するため、RAMとディスク容量を節約できます
.soのバグ修正が、再リンクなしですべてのプログラムに反映されます- ただし、
.soが見つからない、または互換性がない場合、プログラムは起動に失敗します
最後のリスクが、典型的な「依存関係地獄」です。
依存関係の調査
バイナリがどのライブラリにリンクしているかを確認するには、2つのツールが役立ちます。
ldd appは、実行時にローダーが必要とする共有ライブラリを一覧表示しますnm libmymath.aは、ライブラリ内のシンボル(関数)を一覧表示します
lddに「not found」と表示された場合、ローダーは検索パス上でその.soを見つけられていません。
ldd app
nm libmymath.aクイックチェック
フラグと目的を対応させてみましょう。
まとめ
これで、静的ライブラリと共有ライブラリの両方をビルドしてリンクできるようになりました。
- 静的:
ar rcs libX.a *.oで作成し、コードをバイナリにコピーします。自己完結していますが、サイズは大きくなります - 共有:
-fPICを指定してコンパイルし、-sharedでビルドします。コードは実行時にロードされます - どちらも
-Lと-lでリンクします。共有ライブラリにはLD_LIBRARY_PATHのような実行時検索パスが必要です
これで、プリプロセッサからビルドまでのツールチェーンを一通り学びました。
よくある質問
「静的ライブラリと共有ライブラリ」レッスンは無料ですか?
はい。「静的ライブラリと共有ライブラリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「静的ライブラリと共有ライブラリ」で何を学びますか?
ライブラリをビルドしてリンクします。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「静的ライブラリと共有ライブラリ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 条件付きコンパイル
- 複数ファイルのプロジェクト
- Makefile
- 静的ライブラリと共有ライブラリ