Version 15.07
スタティックリンクライブラリと DLL
「ヘッダーファイルの話の次は、ライブラリの話です」
『ライブラリ、って MFC とかランタイムとかそういうののこと?』
「そう、それを使ったり、自分で作る時の話」
『使うのはできるけど、作るのはできないかな』
「使うのもできないでしょ、 MFC とランタイムしか使えないんだから」
『どゆこと?』
「インターネットに落ちてる DLL とかって使える?」
『う…… DLL を System フォルダに置く、とかはわかるけど、プログラム
で使うのはできない……』
「今回からはその説明。 DLL を自分で作って自分で使う、ってところまで
説明します」
『なんか本格的……』
「というわけで、まず【ライブラリ】について」
『ライブラリって、ランタイムもそうだし、 API とか MFC もそうなんだよ
ね』
「そう、 Version 2.14 ( No.025 ) でやったね。ものすごく単純に言う
と」
・プロジェクト外のプログラム
「がライブラリです」
『プロジェクト外……』
「そういうこと。もう少し突き詰めると」
・すでに他のプロジェクトでコンパイルされたプログラム集
「かな」
『コンパイル済み?』
「そう。自分のプロジェクトだと、そのままコンパイルしちゃうでしょ」
『そか、自分のプロジェクトのじゃない他のプロジェクトのプログラムは、
そのプロジェクトでコンパイルされていないといけない……』
「そう、つまり、コンパイルだけしてリンクはまだの、
【オブジェクトファイル】のような形にしたものってこと」
『オブジェクトファイルって Version 15.01 ( No.301 ) のだよね。そ
か、コンパイルだけして、そのあとくっつけるとこはまだ、ってことなん
だ』
「そう、それがライブラリ。そして、そのライブラリには2種類あります」
・スタティックリンクライブラリ
・ダイナミックリンクライブラリ( DLL )
『あ、ここで DLL が出てくるんだ。 DLL ってこの略なんだ……』
「 Dynamic-Link Library 、略して DLL 。かといって
スタティックリンクライブラリを SLL とは略さないんだけどね」
『不公平ー』
「というか、あまり使われないんだよね、スタティックリンクライブラリ
は」
『使われない?』
「というわけで、ここでふたつの違いを見ておきます」
・スタティックリンクライブラリ
リンク時に exe に埋め込まれる。
・ダイナミックリンクライブラリ( DLL )
実行時に exe と結び付けられる。
『スタティックリンクライブラリはリンク時で、 DLL は実行時、ってこ
と?』
「そういうこと。ちなみに〈スタティック〉には〈静的な〉、
〈ダイナミック〉には〈動的な〉っていう意味があります」
『静的なリンクと動的なリンク……』
「そこでさっそく、スタティックリンクライブラリを作ってみましょう」
『え、もう?』
「試してみた方が分かりやすいからね。まず、 Visual C++ ふたつ実行し
て」
『ふたつも?』
「そう、ライブラリを作るときには、ひとつは使う方のプロジェクト、
もうひとつはライブラリ側のプロジェクト、という形でふたつ同時に開く方
が楽だから」
『なるほど、別々のプロジェクトだから、それぞれ開くわけね』
「実行した Visual C++ のうち、ひとつはこれまでと同じ BuildTest
プロジェクトを開いて」
『ほい』
「もうひとつの方で、スタティックリンクライブラリを作ります。まず
メニューの【新規作成】ダイアログで【プロジェクト】タブを開いて、
【Win32 Static Library】を選択して、プロジェクト名は SLLTest で」
『普通にプロジェクト作るのとほとんど同じね』
「次に出てくるダイアログは無視して、そのまま完了」
『ほい、準備できた』
「この状態だと、まだソースファイルはありません。そこで、 BuildTest で
作ったものをそのまま流用します」
『流用?』
「 BuildTest のワークスペースの【FileView】タブを開いて」
『ほい』
「【Source Files】に Sub.cpp が、【Header Files】に Sub.h があるで
しょ」
『うん、作ったのだね』
「これを Delete キーで削除して」
『え!? 削除していいの??』
「うん、ファイルは削除されないから」
『そういうこと……プロジェクトから削除、ってこと?』
「そういうこと。このふたつを削除することでプロジェクトから取り除きま
す。そして、残った Main.cpp をこうします。」
// Main.cpp
#include <Windows.h>
#include "Sub.h"
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
Test();
return 0;
}
『関数ひとつ呼ぶだけね。 Typedef.h はどうするの?』
「それは特に何もしなくていいや。次に、 BuildTest のプロジェクト
フォルダにある Sub.cpp と Sub.h を、さっき作った SLLTest の
プロジェクトフォルダに移動して」
『移動でいいんだね』
「 BuildTest にはもう要らないから。逆に言うと、これまでの例での、
Sub.cpp にあった関数をライブラリとして外に出す、っていう例でもある
し」
『なるほど、今こうして Sub.cpp を SLLTest に移してるわけだ』
「移動したら、SLLTest のワークスペースの【FileView】タブを開いて、
【Source Files】で右クリック、メニューの【ファイルをフォルダに追加】
を選んで」
『ほい。ファイルダイアログ出た。 Sub.cpp を選ぶの?』
「そう、 Sub.cpp を選んで。さらに【Header Files】で同じように Sub.h
を選択して」
『ほいほい。これで BuildTest の時と同じようにプロジェクトに取り込ま
れた、ってこと?』
「そういうこと。自動的に Sub.cpp もコンパイル対象になったから。その
Sub.cpp はこういうふうにして」
// Sub.cpp
#include <Windows.h>
#include "Sub.h"
void Test()
{
OutputDebugString( "テスト\n" );
}
『これが呼び出す関数ね』
「 Sub.h はこう」
// Sub.h
void Test();
『うんうん、普通の感じね』
「これでビルドして」
『え? SLLTest だよね、できちゃうの?』
「できちゃうんです」
『へぇ……うん、じゃあビルドっと』
コンパイル中...
Sub.cpp
ライブラリを作成中...
SLLTest.lib - エラー 0、警告 0
『 exe じゃなくて、 SLLTest.lib ってのが作られるんだ』
「これがスタティックリンクライブラリの本体です」
『へ、本体?』
「そう。この中に Test() 関数の中身とかが入ってるんです」
『この中に……』
「さて、このスタティックリンクライブラリを BuildTest 側で使ってみま
す。まず、ヘッダーファイル Sub.h を見られるようにします」
『それができないと、関数があるって分からないんだもんね』
「ちなみに、別に見られなくても構いません」
『……それって、 Main.cpp の中に Test() 関数の宣言書いちゃうってこ
と?』
「そういうこと。もちろんそんなことをすると、 SLLTest 側で関数を修正
したりした時にもう一度コピペしなきゃいけないから面倒」
『だから見られるようにするわけね』
「あ、その前に、 SLLTest プロジェクトのフォルダ、つまりさっき
Sub.cpp と Sub.h をコピーした、 SLLTest.dsw ファイルのあるフォルダの
フルパスを以下のフォルダとします」
D:\Program\SLLTest
「みなさんはそれぞれ違う環境でテストしていると思いますので、その環境
ごとに読み替えてください」
『はーい』
「以上を踏まえて、 BuildTest のメニューの【プロジェクト】-【設定】
ダイアログを開いて」
『このダイアログっていっぱい書いてあってわけ分かんないんだよね……』
「【C/C++】タブの【プリプロセッサ】ページを開いて」
『プリプロセッサって、 #include とかマクロとかのだよね』
「そう、そのプリプロセッサ。その【インクルードファイルのパス】に
D:\Program\SLLTest
「を書いて」
『さっきのそのままだね』
「これは Sub.h の置いてある場所。これでコンパイルは通るよ」
『……コンパイルは通る、ってことは、リンクでエラーになるってこと?』
「そういうこと」
『……意地悪』
「えーっと……じゃあリンクの方も、ね。【リンク】タブの
【追加ライブラリのパス】に」
D:\Program\SLLTest\Debug
「を書いて、さらに【オブジェクト/ライブラリ モジュール】にいっぱい書
かれている .lib ファイルの一番右端に、半角スペースを挟んで
SLLTest.lib を書いて。そうしたら」
『んじゃビルドして実行! うん、アウトプットウィンドウに〈テスト〉
って出た!』
「これでスタティックリンクライブラリが使えたってわけ」
/*
Preview Next Story!
*/
『な、なんかちょっとよくわからなかったかも……』
「というわけで次回はスタティックリンクライブラリの仕組みについて」
『おおー』
「ま、スタティックリンクライブラリは簡単だけどね」
『そなの?』
「それに比べて DLL は…… DLL は……」
『うわなに暗!』
「というわけで次回」
< Version 15.08 スタティックリンクライブラリの仕組み >
『につづく!』
「ま、そのおかげでヒット数高いんだけどね」
『何の話?』