# C ライブラリの種類

# 1 概要

C 言語では、コードを再利用するためにライブラリとしてまとめる方法が 2 種類あります。静的ライブラリ (Linux: `.a`、Windows: `.lib`) は実行ファイルにリンク時に組み込まれ、動的ライブラリ (Linux: `.so`、Windows: `.dll`) は実行時に読み込まれます。それぞれにメリット・デメリットがあり、用途に応じて使い分けます。

このリポジトリの `prod/calc/` はこの 2 種類のライブラリを意図的に使い分けています。`libcalcbase` (add / subtract / multiply / divide) は静的ライブラリとして提供され、`libcalc` (calcHandler) は動的ライブラリとして提供されます。`libcalc` は `libcalcbase` に依存しており、ライブラリの生成時に参照されます。`src/shared-and-static-calc/` は両方を同時にリンクするサンプルです。

また、.NET 連携においては `libcalc.dll` (Windows) または `libcalc.so` (Linux) を P/Invoke で呼び出す実装が `prod/calc.net/` に含まれています。ライブラリの種類と動作の違いを理解することは、このリポジトリのビルド構成を理解するための重要なステップです。

# 2 習得目標

## 2.1 プラットフォーム共通

- 静的ライブラリと動的ライブラリの違いを説明できる
- `prod/calc/` のライブラリ構成を読み取ることができる

## 2.2 Linux

- GCC で静的ライブラリ (`.a`) をビルドできる (`ar` コマンド)
- GCC で動的ライブラリ (`.so`) をビルドできる (`-shared -fPIC` オプション)
- 実行ファイルに静的ライブラリをリンクできる (`-l` / `-L` オプション)
- 実行ファイルに動的ライブラリをリンクし、実行時パスを設定できる (`LD_LIBRARY_PATH`)

## 2.3 Windows

- MSVC で静的ライブラリ (`.lib`) をビルドできる (`lib.exe` コマンド)
- MSVC で動的ライブラリ (`.dll`) をビルドできる (`/LD` オプション)
- 実行ファイルに静的ライブラリをリンクできる (追加の依存ファイル設定)
- 実行ファイルに動的ライブラリをリンクし、実行時パスを設定できる (`PATH`)
- Windows での DLL ビルドに必要な `__declspec(dllexport)` / `__declspec(dllimport)` を理解できる

# 3 学習マテリアル

## 3.1 公式ドキュメント

- GCC リンクオプション - `-l`・`-L`・`-shared`・`-fPIC` などのオプション説明 (英語)
- DLL の作成と使用 (Microsoft Learn) - Windows DLL の作成チュートリアル (日本語)
- cppreference - C 言語 - C 言語リファレンス (日本語)

## 3.2 チュートリアル・入門

- P/Invoke の概要 (Microsoft Learn) - .NET から C ライブラリを呼び出す仕組みの解説 (日本語)

# 4 このリポジトリとの関連

## 4.1 使用箇所 (具体的なファイル・コマンド)

ライブラリの構成:

ライブラリ構成一覧
ライブラリ | 種別 | Linux | Windows | 実装ファイル
--- | --- | --- | --- | ---
`libcalcbase` | 静的 | `libcalcbase.a` | `libcalcbase.lib` | `prod/calc/libsrc/calcbase/`
`libcalc` | 動的 | `libcalc.so` | `libcalc.dll` | `prod/calc/libsrc/calc/`

各プログラムのリンク方式:

各プログラムのリンク方式
プログラム | リンク | ソース
--- | --- | ---
`add` | `libcalcbase` を静的リンク | `prod/calc/src/add/add.c`
`calc` | `libcalc` を動的リンク | `prod/calc/src/calc/calc.c`
`shared-and-static-calc` | 両方をリンク | `prod/calc/src/shared-and-static-calc/`

ヘッダーファイル:

- `prod/calc/include/libcalc_const.h` - 定数定義 (`CALC_SUCCESS` など)
- `prod/calc/include/libcalcbase.h` - 静的ライブラリ用ヘッダー
- `prod/calc/include/libcalc.h` - 動的ライブラリ用ヘッダー

## 4.2 関連ドキュメント

- ビルド設計 - このリポジトリのビルド構成の詳細
- GNU Make (スキルガイド) - makefile によるビルド自動化
- C# / P/Invoke (スキルガイド) - .NET から C ライブラリを呼び出す