トップ
ジャンル別トップ

スタティックライブラリを作って読み込んでみよう




@スタティックライブラリって何だ?

スタティックライブラリはDLLと同じく外部に関数やクラス群を置き、使用ファイルから参照されますので現在のプロジェクトに必要なファイルだけをまとめ やすくない、見通しが良くなります。
このスタティックライブラリのDLLと違う点はDLLが好きな時に関数をメモリ上に確保するのに対し、スタティックライブラリはコンパイル時にコードに 組み込まれます、モジュールが大きくなりますがライブラリが見つからないということが無いので気にすることが少なくなります。
では作り方から見ていきましょう。


Aスタティックライブラリプロジェクトの作り方

まずはVisualStudioを起動しプロジェクトを作ります、プロジェクト名を決めて以下のような所まで来るはず。
StaticLibraryProject.gif(27427 byte)
項目のスタティックライブラリにラジオボタンを指定し作成でプロジェクト設定は以上で終了です。


B関数を追加してみよう

プロジェクト設定が終わったら勝手に[ stdafx.cpp : stdafx.h ]が作られているはずです。ですがこの2つは今はほおっておき新たにCPPとHファイルを 自分で追加してください、ここでは[ StaticLibTest.h : StaticLbTest.cpp ]としておきます。
そしていつものように関数宣言をHに関数内容をCPPに書きます、この時CPPには宣言ファイル以外にデフォルトで作られた[ stdafx.h ]をインクルード してください、これを追加し忘れると[ プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。]と エラーを返されます。
そしてコンパイルに成功すると[ プロジェクト名.lib ]のobject file library が作られています、このlibとHを呼び出し側で使います。
次は呼び出し側を見てみましょう。


Cスタティックライブラリから関数を使ってみよう

スタティックライブラリから関数の呼び出しですが、まずはスタティックライブラリでのHが必要になります、上記の例ですと[ StaticLibTest.h ]です これはVisualStuidでの追加インクルードでまとめて指定してしまうと楽でしょう、指定のし方は[ プロパティ → 構成プロパティ → C++ →  全般 → 追加のインクルードディレクトトリ ]で指定できます、この時点でショートカット等に関数名がコレクションされていますがこのままでは まだ呼び出せません。
次にライブラリファイルを追加します、これは先ほど作ったlibファイルを指定します、先ほどと同じようにVisualStudioでは [ プロパティ → 構成プロパティ → 隣家 → 追加の依存ファイル ]にlibファイル名を指定します、もしくはプログラムコード上に #pragma comment( lib, "libファイル名.lib" ) と書き追加します。
どちらの場合でもこのlibファイルを呼び出し元ファイルと一緒の所に入れておく必要があります、入れないとlibファイルが見つからないといわれるので すぐきずくと思います。


D呼び出しの一例

スタティックライブラリ呼び出しの一例です、場合により異なりますのでご自分にあった環境で正しい呼び方をしてください。

呼び出し例
		
#include < stdio.h >

//lib内で作ったH名
#include "StaticLibTest.h"
//コードに埋め込んだ時に場合は必要
#pragma comment( lib, "StaticLibTest.lib" )

int main()
{
	//ライブラリ内で作った関数を呼ぶ
	StaticLibTest1();
}


E汎用変数に注意しろ

便利なスタティックライブラリですが汎用変数には注意してください、たとえばスタティックライブラリをUnicodeで作り呼び出し元がマルチバイトでの プロジェクトだと文字に対する扱いが違うため思いもよらぬ動作を引き起こします。
DirectXでも見てみるとこれに対策するようの物が見当たります。
まずUnicodeとマルチバイトどちかが使われているかを調べます、Unicodeが使われているばマクロ[ UNICODE ]が自動で宣言されますので
#ifdef UNICODE と書き場合により異なる関数に変更するように指示すれば呼び出し元で使用する関数を選択しなくて済みます。この時2つの関数は別名で定義し ないと2重定義で怒られますので注意です。

場合書き分け例
#ifdef UNICODE
#define MyGet GetUnicode
#else
#define MyGet GetmultiByte
#endif

あとは違うところで#define GetUnicodeとGetmultiByteの中身を埋めてあげればよいのです。
両対応にするのにはめんどくさいのでその時あった方を選択しましょう。