プログラムを整理する方法にはいくつかの選択肢があります。代表的なのは 静的ライブラリ、DLL(動的ライブラリ)、そしてヘッダーオンリーライブラリです。どれも「コードを再利用する」ための仕組みですが、性質は大きく異なります。
本記事では静的ライブラリに焦点を当てて作り方と使い方を紹介します。
また、学習目的であるため空のプロジェクトから作成を行います。
想定環境
C++VisualStudio2022
前提知識
-
C++の基礎文法を理解している -
VisualStudio2022をある程度使ったことがある
静的ライブラリとは
静的ライブラリとは、複数のオブジェクトファイルをひとまとめにしてアーカイブしたファイルのことです。
ライブラリにはいくつかの選択肢がありますが、静的ライブラリはその中でも「ビルド時に実行ファイルへ組み込まれる」という特徴があり、配布が簡単で依存関係が少ないというメリットがあります。
| 項目 | ヘッダーオンリー | DLL (動的リンクライブラリ) | 静的リンクライブラリ |
|---|---|---|---|
| 導入方法 |
#include するだけ |
DLLファイルを配置し、リンク設定が必要 |
.lib をリンク設定に追加 |
| 配布 | ヘッダーファイルのみ |
DLLファイル+インポートライブラリ |
.lib ファイル |
| ビルド時間 | 長くなりやすい(全ソースに展開) | 比較的短い(共有コードはDLL側) |
中程度(リンク時に結合) |
| 実行時の依存 | なし(ソースに展開済み) |
DLLが存在しないと実行不可 |
なし(実行ファイルに埋め込み済み) |
| 更新・差し替え | 再コンパイルが必要 |
DLLを差し替えるだけで更新可能 |
再リンクが必要 |
| デバッグ | ソースが見えるので容易 |
DLL内部は別途デバッグが必要 |
ソースがあれば容易 |
| 実行ファイルのサイズ | 大きい | 小さい | 大きい |
ライブラリ側のセットアップ
VisualStudio2022を開き、新しいプロジェクトの作成っをクリックします。

空のプロジェクトを選択して、GUI右下の次へをクリックしてください。

プロジェクト名を設定して、右下の作成をクリックし、プロジェクトを作成します。

ソリューションエクスプローラから任意の.cppファイル(本記事ではMyStaticLib.cpp)を追加してください。
ソースファイルが存在しない場合は後に操作するプロパティ設定の画面を開くことが出来ません。

上部GUIのプロジェクト->プロパティをクリックしてプロパティウィンドウを開いてください。

ウィンドウ左から構成プロパティ->全般を選択し、ウィンドウ右にある構成の種類をスタティックライブラリ(.lib)に変更し、ウィンドウ右下にある適用ボタンをクリックして変更を適用します。

これで、静的ライブラリを作成するためのセットアップが完了しました。
コードサンプル
HelloWorldを出力する関数があるだけのライブラリコード
//-----------------------------------------------------------
//! @file MyStaticLib.hpp
//! @brief 静的ライブラリサンプルのヘッダーファイル
//! @author つきの
//-----------------------------------------------------------
#pragma once
namespace MyStaticLib {
//-----------------------------------------------------------
// "Hello, World!"を出力するだけの関数
//-----------------------------------------------------------
void PrintHelloWorld();
} // namespace MyStaticLib
//-----------------------------------------------------------
//! @file MyStaticLib.cpp
//! @brief 静的ライブラリサンプルのcppファイル
//! @author つきの
//-----------------------------------------------------------
#include <iostream>
#include "MyStaticLib.hpp"
namespace MyStaticLib {
//-----------------------------------------------------------
//! @brief "Hello, World!"を出力するだけの関数
//-----------------------------------------------------------
void PrintHelloWorld() {
std::cout << "Hello, World!" << std::endl;
}
} // namespace MyStaticLib
実際に配布を行う場合は、名前の衝突を未然に防ぐために名前空間を用意することが推奨されます。
ライブラリのビルド
GUI上部からビルド設定をReleaseにしてください。
配布を行う際にビルド設定がDebugになっていると最適化がオフになっているため、利用側のパフォーマンス低下につながる上に、.pdbファイルなどのデバッグ情報が必要になり余計な依存関係を生むケースがあります。

GUI上部のビルド->ソリューションのビルドをクリックして、ビルドを行います。

エクスプローラを開き、ソリューションディレクトリのx64->Releaseに.libファイルが生成されていたらビルドが成功しています。

ライブラリのディレクトリ作成
使用する側に渡すファイルをまとめたいと思います。
ディレクトリ構成は以下の通りにします。
配布する際はこの中にREADMEなども入れることが推奨されます。
MyStaticLib/
├─ include/ ← ヘッダーファイル群
│ └─ MyStaticLib.hpp
└─ lib/ ← ビルド済みライブラリ
└─ MyStaticLib.lib
利用側のセットアップ
VisualStudio2022を開き、新しいプロジェクトの作成をクリックしてください。

空のプロジェクトを選択して、GUI右下の次へをクリックします。

プロジェクト名を記入して、GUI右下の作成をクリックします。

ソリューションディレクトリに先ほどの利用側に渡す用のディレクトリを入れます。

プロパティを設定するので、cppファイルを追加してください(本記事ではmain.cpp)。

GUI上部のプロジェクト->プロパティからプロパティウィンドウを開いてください。

ウィンドウ左から構成プロパティ->C/C++を選択し、ウィンドウ右の追加のインクルードディレクトリにライブラリの.hppが入ったディレクトリのパス(本記事ではMyStaticLib/include)を入力し、OKをクリックしてください。

次に、ウィンドウ左から構成プロパティ->リンカー->全般を選択して、ウィンドウ右の追加のライブラリディレクトリの項目にライブラリの.libファイルが入ったディレクトリのパス(本記事ではMyStaticLib/lib)を入力し、OKをクリックしてください。

最後に、ウィンドウ左から構成プロパティ->リンカー->入力を選択し、ウィンドウ右の追加の依存ファイルの項目に、使用したいライブラリのファイル名(本記事ではMyStaticLib.libのみ)を入力してOKをクリックしてください。

プロパティウィンドウの右下の適用をクリックして、変更を適用してください。
これで利用側のセットアップが完了です。
利用側のサンプルコード
//--------------------------------------------------------------
//! @file main.cpp
//! @brief 静的ライブラリのテストコード
//! @author つきの
//--------------------------------------------------------------
#include "MyStaticLib.hpp"
//エントリポイント
int main() {
// "Hello, World!"を表示
MyStaticLib::PrintHelloWorld();
return 0;
}
Hello, World!
ライブラリのヘッダーをインクルードすれば使用できるようになりました。
#include "MyStaticLib.hpp"
特殊な記法などは使用していないので、ソースコードについて特に補足は必要ないかと思います。
総括
-
静的ライブラリでは.libとヘッダーを配布すればよいため動的ライブラリよりも配布が簡便であり、実行時の依存関係は少なくなる - ビルド成果物は
動的ライブラリを使用した場合よりもサイズが大きくなるというデメリットもある -
VisualStadio2022で静的ライブラリを作成したい場合は、プロパティウィンドウから構成の種類をスタティックライブラリに変更してビルドを行うことで作成できる -
Debugビルドで静的ライブラリを作成するとサイズが大きくなったり、.pdbが必要になるといった問題が発生するので、配布する際には必ずReleaseモードでビルドを行う