【Visual Studio 2017入門:第10回】スタティックリンクライブラリはどうやって作る?

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp

今回はVisualStudio2017でどうスタティックリンクライブラリを作ればいいかわからない方向けにスタティックリンクライブラリの作り方を解説します。
記事を読みながら、実際にスタティックリンクライブラリを作成してみてください。

DLLとどう違う?

恐らくスタティックリンクライブラリについて調べると「DLL(ダイナミックリンクライブラリ)」という言葉も一緒に出てくるのではないでしょうか。
どちらも「ライブラリ」という言葉がついていて何となく似ているような気がします。何が具体的に違うのでしょうか。

リンクするタイミング

ライブラリをプログラムで使うにはライブラリをリンクする必要があります。
DLLはプログラムの実行時に、スタティックリンクライブラリは実行可能ファイル(exe)作成時にそれぞれリンクされます。

ライブラリを置く場所

DLL,スタティックリンクライブラリでリンクするタイミングが違うためライブラリ本体のデータが置かれる場所も異なります。
DLLはプログラム本体とは別のファイルとして置かれますが、スタティックリンクライブラリはプログラム本体の中に含めて置かれます。外から見るとプログラム本体のファイルしかないように見えます。

どちらを使ったほうがいい?

どちらも長所・短所があり、一概には言えません。

DLLではプログラム本体とライブラリ本体を分けて管理するため「ライブラリだけ差し替える」ということが可能になりますし、一つのDLLを複数のプログラムで使用することも出来ます。
しかしプログラム本体のバージョンとライブラリのバージョンがずれる危険性があります。

スタティックリンクライブラリではプログラム本体にライブラリを一緒に含めるためバージョンがずれる危険性は低くなっていますが、DLLでは出来た「ライブラリだけを差し替える」といったことは出来なくなりライブラリを複数のプログラムで共有することも出来ません。

スタティックリンクライブラリの作り方

プロジェクトを作る

スタティックリンクライブラリを作るには、スタティックリンクライブラリを作成するためのプロジェクトを作成する必要があります。

プロジェクトの新規作成画面を開き、「スタティックリンクライブラリ」をクリックしてください。
alt

ファイルを追加する

ライブラリ本体のコードを書くファイルをプロジェクトに追加する必要があります。
以下の内容のstaticLib.cppstaticLib.hを追加してください。
static.cpp

#include "stdafx.h"
#include "staticLib.h"

EXPORT int retAddNum(int a, int b) {
    return a + b;
}

staticLib.h

#pragma once
#include<windows.h>
#define EXPORT extern "C"
EXPORT int retAddNum(int a, int b);

スタティックリンクライブラリを出力する

プロジェクトをビルドするとスタティックリンクライブラリが出力されます。
ライブラリを他人に配布する場合はRelease構成にしてビルドしてください。

ビルドに成功していれば、Debugフォルダ(Release構成でビルドした場合はReleaseフォルダ)に[プロジェクト名].libというファイルが存在するはずです。
これがスタティックリンクライブラリとなります。

Column:なぜビルドするだけでライブラリが出力されるのか

特に何の設定もしていないのになぜある時にはexeファイルが出力され、ある時にはライブラリが出力されるのでしょうか。

それは、プロジェクトを新規作成するときに選択したプロジェクトが違うからです。

プロジェクトのプロパティを開くと分かりますが、プロジェクトには非常に多くの設定が存在します。この設定項目を人力でプロジェクトを作成するたびに設定するのは非常に面倒です。

さらに利用目的ごとに大体の設定内容は決まっています。
そこで設定内容をまとめておいてプロジェクト作成時に呼び出して、プロジェクトを作成するようにします。この「プロジェクトの設定内容」のことをプロジェクトテンプレートと呼びます。

プロジェクト新規作成時に選択していたのはプロジェクトテンプレートであり、プロジェクトテンプレートごとに設定内容が既に記録されていたため、何の設定もしなくてもよかったというわけです。

もう一つプロジェクトを作成する

スタティックリンクライブラリをプログラム中で呼び出せるか確認するために、テスト用のプロジェクトを先ほど作成したプロジェクトと同じソリューションの中に作成します。
作成するプロジェクトの種類は「Windows コンソール アプリケーション」にしてください。

詳しいプロジェクトの作成方法については 第6回をご覧ください。

コードを入力する

テスト用プロジェクトに作成されているConsoleApplication1.cppに以下の内容のソースコードを入力してください。

#include "pch.h"
#include <iostream>
#include "../static/staticLib.h"


int main(void) {
    int retNum;
    retNum = retAddNum(2, 3);
    std::cout << retNum << std::endl;
    return 0;
}

リンクの設定を行う

ビルド時に作成したスタティックリンクライブラリをプログラム本体にリンクする設定をする必要があります。

ソリューションエクスプローラーの[テスト用プロジェクトの名前]をクリックし、メニューバーのプロジェクト-[テスト用プロジェクトの名前]のプロパティをクリックします。
すると以下のようなウィンドウが表示されます。
alt

続いて右のメニューからリンカー-入力をクリックし、追加の依存ファイルの右のほうにあるボタンをクリックします。
alt

入力画面が表示されますので、下の文字を入力します。

$(SolutionDir)Debug\static.lib

最後にプロパティ画面のOKを押して設定は完了です。

ビルドし実行する

テスト用のプロジェクトをビルドして実行します。
5という値がコンソール上に表示されればスタティックリンクライブラリを正しく呼び出せています。

次回予告

次回は、VisualStudio2017でよく使うショートカットについて解説します。

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp