#pragma twice

KAB-studio > プログラミング > #pragma twice > 307 Version 15.07 スタティックリンクライブラリと DLL

#pragma twice 307 Version 15.07 スタティックリンクライブラリと DLL

前のページへ 表紙・目次へ 次のページへ

 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 スタティックリンクライブラリの仕組み >
につづく!
ま、そのおかげでヒット数高いんだけどね
何の話?
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。