<!DOCUMENT HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

<html>

<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" type="text/css" href="../../default.css">
<title>STLport</title>
</head>

<body>
<!--#include virtual="../../menu2.html"-->
<div class="contents">
<h4>contents</h4>
<ol>
	<li><a href="#install">導入</a></li>
	<li><a href="#usage">使い方</a></li>
	<li><a href="#error">コンパイルエラーがでる！</a></li>
	<li><a href="#sample">サンプル</a></li>
</ol>
</div>

<h1>STLport</h1>

<div>
<p>STLportは、<a href="http://www.stlport.org/">STLport.org</a>が配布している、効率的、スレッドセーフ、例外セーフなSTLです。
また、標準STLには含まれていない、ハッシュ、単方向リスト、ロープ（長い文字列）クラスがあります。
iostreamライブラリは、STLportのものとOS付属のものを切り替えられるようになっています。</p>
</div>

<h2 id="install">導入</h2>
<div>
	<p>
		ソースを<a href="http://www.stlport.org/">STLport.org</a>からダウンロードします。
		詳しくは、INSTALLに書いてありますが、VC++でコンパイルする場合は以下のような流れになります。
		また、STLportのiostreamを使わない場合は、コンパイルの必要はありません。
	</p>
	<h3>VC++6.0の場合</h3>
	<ol>
	<li>ディレクトリ付きで解凍する。</li>
	<li>コマンドプロンプトを開き、srcディレクトリへ移動。</li>
	<li><kbd>&quot;C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat&quot;</kbd>で環境変数を登録する。</li>
	<li><kbd>copy vc6.mak makefile</kbd></li>
	<li><kbd>nmake clean all</kbd>
		static版とDLL版の両方が生成される。</li>
	<li><kbd>nmake install</kbd>
		ヘッダがINCLUDE/stlportに、.libがLIBに、DLLがsystem32にコピーされる。</li>
	<li>VC++の設定で、「ツール＞オプション＞ディレクトリ＞インクルード」にstlportのパスを追加する。
	デフォルトならば、<kbd>C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\stlport</kbd>。</li>
	</ol>
	<h3>VC++7.0の場合</h3>
	「VisualStudio.NET コマンドプロンプト」を使用し、<kbd>copy vc7.mak makefile</kbd>します。
	環境変数の登録は必要ありません。
	<h3>設定ファイルの編集</h3>
	<p>
		次は設定ファイルの編集です。
		<kbd>INCLUDE/stlport/stl_user_config.h</kbd>を開き、いくつかの#defineのコメントを外します。
	</p>
	<ul>
		<li>OSデフォルトのiostreamsを使う場合は<code>STLP_NO_OWN_IOSTREAMS</code>を定義</li>
		<li>PlatformSDKを使っている場合は<code>STLP_NEW_PLATFORM_SDK</code>を定義（VC++7.0では必要なし）</li>
	</ul>
</div>

<h2 id="usage">使い方</h2>
<div>
	<p>まず、<em>全ての#includeよりも先に</em>、以下のコードを書いておきます。
		プリコンパイルヘッダを使っている場合は、stdafx.hの先頭に書くことになります。
		デバッグ時とリリース時で自動的にリンクするライブラリを換えてくれます。
		#pragmaは「255文字に切り捨てられました」のwarningを出さないためのおまじないです。</p>
<pre><code>#ifdef NDEBUG
    #undef _STLP_DEBUG
#else
    #pragma warning(disable:4786)
    #define _STLP_DEBUG 1
#endif</code></pre>

	<p>デバッグモードの注意点として、<code>std::vector&lt;T&gt;::iterator</code>と<code>T*</code>の型が違うとことがあります。
		リリースでは同義です。<del>この仮定は保証されていませんが、使いたくなる局面が多いので……。</del>
		<code>&amp;vec[0]</code>ならばともに<code>T*</code>の意味になりますので、こちらを使いましょう。
		<code>&amp;*vec.begin()</code>でもかまいません。</p>
	<p>次に、以下の4つのうちのひとつを#defineします。</p>
	<dl>
		<dt><code>_STLP_NO_OWN_IOSTREAMS</code></dt>
		<dd>STLportのiostreamを使いません。</dd>
		<dt><code>_STLP_USE_STATIC_LIB</code></dt>
		<dd>スタティックリンク版のiostreamを使います。デフォルト。</dd>
		<dt><code>_STLP_USE_STATICX_LIB</code></dt>
		<dd>（スタティック版との違いが理解できてません。）</dd>
		<dt><code>_STLP_USE_DYNAMIC_LIB</code></dt>
		<dd>ダイナミックリンク版のiostreamを使います。実行環境にDLLが必要です。</dd>
	</dl>
	<p>STLportのiostreamを使う場合、マルチスレッド対応のランタイムルーチン版のライブラリを使わないといけません。
		「プロジェクト＞設定＞C++＞コード生成＞使用するランライムライブラリ」をマルチスレッド版に変更しておきます。</p>
</div>

<h2 id="error">コンパイルエラーが出る！</h2>
<div>
		<h3>DLL版を使うと、「DLLインタフェイスなんちゃら」のwarningが出る</h3>
		<div>
			具体的には、
			<blockquote>C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\stlport\stdexcept(52) : warning C4275: DLL ｲﾝﾀｰﾌｪｲｽではない class 'exception' が DLL ｲﾝﾀｰﾌｪｲｽのﾍﾞｰｽになる class '_STL::__Named_exception' として使われています。
        C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\../include/exception(50) : 'exception' の宣言を確認してください。</blockquote>
			とりあえず無視？
		</div>
		<h3>「LIBCMTが競合している」というwarningが出る</h3>
		<div>
			#define _STLP_DEBUG 1 よりも先にSTLportのヘッダを読み込んでいるのが問題。
			&lt;windows.h&gt;などからも間接的にインクルードされます。
			何よりも先に#defineしてください。
		</div>
		<h3>「InterlockedXXXのエラー」が出る</h3>
		<div>
			PlatformSDKを使っていて、<code>STLP_NEW_PLATFORM_SDK</code>を#defineするのを忘れているのが問題です。
			<kbd>INCLUDE/stlport/stl_user_config.h</kbd>を編集する必要があります。
		</div>
</div>

</div>

<h2 id="sample">サンプル</h2>
<div>
<pre><code>#include &lt;iostream&gt;
int main(int argc, char* argv[])
{
    std::cout << "hello, world." << std::endl;
    return 0;
}</code></pre>
をマルチスレッドの設定でコンパイルしてみました。
<dl>
<p><table border="1">
<tr><th>設定</th><th>ファイルサイズ</th></tr>
<tr><td>_STLP_NO_OWN_IOSTREAMS</td><td>72KB</td></tr>
<tr><td>_STLP_USE_STATIC_LIB</td><td>216KB</td></tr>
<tr><td>_STLP_USE_STATICX_LIB</td><td>216KB</td></tr>
<tr><td>_STLP_USE_DYNAMIC_LIB</td><td>40KB</td></tr>
</table></p>
<p>やっぱりスタティックリンクすると巨大になりますね……。</p>
</div>

<hr>
<p align="right">2002/04/27</p>

</body>
</html>
