0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プログラムを整理する方法にはいくつかの選択肢があります。代表的なのは 静的ライブラリDLL動的ライブラリ)、そしてヘッダーオンリーライブラリです。どれも「コードを再利用する」ための仕組みですが、性質は大きく異なります。
本記事では静的ライブラリに焦点を当てて作り方と使い方を紹介します。
また、学習目的であるため空のプロジェクトから作成を行います。

想定環境

  • C++
  • VisualStudio2022

前提知識

  • C++の基礎文法を理解している
  • VisualStudio2022をある程度使ったことがある

静的ライブラリとは

静的ライブラリとは、複数のオブジェクトファイルをひとまとめにしてアーカイブしたファイルのことです。
ライブラリにはいくつかの選択肢がありますが、静的ライブラリはその中でも「ビルド時に実行ファイルへ組み込まれる」という特徴があり、配布が簡単で依存関係が少ないというメリットがあります。

項目 ヘッダーオンリー DLL (動的リンクライブラリ) 静的リンクライブラリ
導入方法 #include するだけ DLLファイルを配置し、リンク設定が必要 .lib をリンク設定に追加
配布 ヘッダーファイルのみ DLLファイル+インポートライブラリ .lib ファイル
ビルド時間 長くなりやすい(全ソースに展開) 比較的短い(共有コードはDLL側) 中程度(リンク時に結合)
実行時の依存 なし(ソースに展開済み) DLLが存在しないと実行不可 なし(実行ファイルに埋め込み済み)
更新・差し替え 再コンパイルが必要 DLLを差し替えるだけで更新可能 再リンクが必要
デバッグ ソースが見えるので容易 DLL内部は別途デバッグが必要 ソースがあれば容易
実行ファイルのサイズ 大きい 小さい 大きい

ライブラリ側のセットアップ

VisualStudio2022を開き、新しいプロジェクトの作成っをクリックします。
スクリーンショット (135).png
空のプロジェクトを選択して、GUI右下の次へをクリックしてください。
スクリーンショット (136).png
プロジェクト名を設定して、右下の作成をクリックし、プロジェクトを作成します。
スクリーンショット (137).png
ソリューションエクスプローラから任意の.cppファイル(本記事ではMyStaticLib.cpp)を追加してください。
ソースファイルが存在しない場合は後に操作するプロパティ設定の画面を開くことが出来ません。
スクリーンショット (139).png
上部GUIプロジェクト->プロパティをクリックしてプロパティウィンドウを開いてください。
スクリーンショット (141).png
ウィンドウ左から構成プロパティ->全般を選択し、ウィンドウ右にある構成の種類スタティックライブラリ(.lib)に変更し、ウィンドウ右下にある適用ボタンをクリックして変更を適用します。
スクリーンショット (140).png
これで、静的ライブラリを作成するためのセットアップが完了しました。

コードサンプル

HelloWorldを出力する関数があるだけのライブラリコード

MyStaticLib.hpp
//-----------------------------------------------------------
//! @file   MyStaticLib.hpp
//! @brief  静的ライブラリサンプルのヘッダーファイル
//! @author つきの
//-----------------------------------------------------------
#pragma once
namespace MyStaticLib {
	//-----------------------------------------------------------
	// "Hello, World!"を出力するだけの関数
	//-----------------------------------------------------------
	void PrintHelloWorld();
}  // namespace MyStaticLib
MyStaticLib.cpp
//-----------------------------------------------------------
//! @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ファイルなどのデバッグ情報が必要になり余計な依存関係を生むケースがあります。
スクリーンショット (142).png
GUI上部のビルド->ソリューションのビルドをクリックして、ビルドを行います。
スクリーンショット (143).png
エクスプローラを開き、ソリューションディレクトリのx64->Release.libファイルが生成されていたらビルドが成功しています。
スクリーンショット (144).png

ライブラリのディレクトリ作成

使用する側に渡すファイルをまとめたいと思います。
ディレクトリ構成は以下の通りにします。
配布する際はこの中にREADMEなども入れることが推奨されます。

Directory
MyStaticLib/
 ├─ include/          ← ヘッダーファイル群
 │   └─ MyStaticLib.hpp
 └─ lib/              ← ビルド済みライブラリ
     └─ MyStaticLib.lib

利用側のセットアップ

VisualStudio2022を開き、新しいプロジェクトの作成をクリックしてください。
スクリーンショット (145).png
空のプロジェクトを選択して、GUI右下の次へをクリックします。
スクリーンショット (146).png
プロジェクト名を記入して、GUI右下の作成をクリックします。
スクリーンショット (147).png
ソリューションディレクトリに先ほどの利用側に渡す用のディレクトリを入れます。
スクリーンショット (148).png
プロパティを設定するので、cppファイルを追加してください(本記事ではmain.cpp)。
スクリーンショット (149).png
GUI上部のプロジェクト->プロパティからプロパティウィンドウを開いてください。
スクリーンショット (150).png
ウィンドウ左から構成プロパティ->C/C++を選択し、ウィンドウ右の追加のインクルードディレクトリにライブラリの.hppが入ったディレクトリのパス(本記事ではMyStaticLib/include)を入力し、OKをクリックしてください。
スクリーンショット (151).png
次に、ウィンドウ左から構成プロパティ->リンカー->全般を選択して、ウィンドウ右の追加のライブラリディレクトリの項目にライブラリの.libファイルが入ったディレクトリのパス(本記事ではMyStaticLib/lib)を入力し、OKをクリックしてください。
スクリーンショット (152).png
最後に、ウィンドウ左から構成プロパティ->リンカー->入力を選択し、ウィンドウ右の追加の依存ファイルの項目に、使用したいライブラリのファイル名(本記事ではMyStaticLib.libのみ)を入力してOKをクリックしてください。
スクリーンショット (153).png
プロパティウィンドウの右下の適用をクリックして、変更を適用してください。
これで利用側のセットアップが完了です。

利用側のサンプルコード

main.cpp
//--------------------------------------------------------------
//! @file  main.cpp
//! @brief 静的ライブラリのテストコード
//! @author つきの
//--------------------------------------------------------------
#include "MyStaticLib.hpp"
//エントリポイント
int main() {
	// "Hello, World!"を表示
    MyStaticLib::PrintHelloWorld();
    return 0;
}
result
Hello, World!

ライブラリのヘッダーをインクルードすれば使用できるようになりました。

main.cpp
#include "MyStaticLib.hpp"

特殊な記法などは使用していないので、ソースコードについて特に補足は必要ないかと思います。

総括

  • 静的ライブラリでは.libとヘッダーを配布すればよいため動的ライブラリよりも配布が簡便であり、実行時の依存関係は少なくなる
  • ビルド成果物は動的ライブラリを使用した場合よりもサイズが大きくなるというデメリットもある
  • VisualStadio2022静的ライブラリを作成したい場合は、プロパティウィンドウから構成の種類スタティックライブラリに変更してビルドを行うことで作成できる
  • Debugビルドで静的ライブラリを作成するとサイズが大きくなったり、.pdbが必要になるといった問題が発生するので、配布する際には必ずReleaseモードでビルドを行う
0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?