contents

  1. 導入
  2. 使い方
  3. コンパイルエラーがでる!
  4. サンプル

STLport

STLportは、STLport.orgが配布している、効率的、スレッドセーフ、例外セーフなSTLです。 また、標準STLには含まれていない、ハッシュ、単方向リスト、ロープ(長い文字列)クラスがあります。 iostreamライブラリは、STLportのものとOS付属のものを切り替えられるようになっています。

導入

ソースをSTLport.orgからダウンロードします。 詳しくは、INSTALLに書いてありますが、VC++でコンパイルする場合は以下のような流れになります。 また、STLportのiostreamを使わない場合は、コンパイルの必要はありません。

VC++6.0の場合

  1. ディレクトリ付きで解凍する。
  2. コマンドプロンプトを開き、srcディレクトリへ移動。
  3. "C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat"で環境変数を登録する。
  4. copy vc6.mak makefile
  5. nmake clean all static版とDLL版の両方が生成される。
  6. nmake install ヘッダがINCLUDE/stlportに、.libがLIBに、DLLがsystem32にコピーされる。
  7. VC++の設定で、「ツール>オプション>ディレクトリ>インクルード」にstlportのパスを追加する。 デフォルトならば、C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\stlport

VC++7.0の場合

「VisualStudio.NET コマンドプロンプト」を使用し、copy vc7.mak makefileします。 環境変数の登録は必要ありません。

設定ファイルの編集

次は設定ファイルの編集です。 INCLUDE/stlport/stl_user_config.hを開き、いくつかの#defineのコメントを外します。

使い方

まず、全ての#includeよりも先に、以下のコードを書いておきます。 プリコンパイルヘッダを使っている場合は、stdafx.hの先頭に書くことになります。 デバッグ時とリリース時で自動的にリンクするライブラリを換えてくれます。 #pragmaは「255文字に切り捨てられました」のwarningを出さないためのおまじないです。

#ifdef NDEBUG
    #undef _STLP_DEBUG
#else
    #pragma warning(disable:4786)
    #define _STLP_DEBUG 1
#endif

デバッグモードの注意点として、std::vector<T>::iteratorT*の型が違うとことがあります。 リリースでは同義です。この仮定は保証されていませんが、使いたくなる局面が多いので……。 &vec[0]ならばともにT*の意味になりますので、こちらを使いましょう。 &*vec.begin()でもかまいません。

次に、以下の4つのうちのひとつを#defineします。

_STLP_NO_OWN_IOSTREAMS
STLportのiostreamを使いません。
_STLP_USE_STATIC_LIB
スタティックリンク版のiostreamを使います。デフォルト。
_STLP_USE_STATICX_LIB
(スタティック版との違いが理解できてません。)
_STLP_USE_DYNAMIC_LIB
ダイナミックリンク版のiostreamを使います。実行環境にDLLが必要です。

STLportのiostreamを使う場合、マルチスレッド対応のランタイムルーチン版のライブラリを使わないといけません。 「プロジェクト>設定>C++>コード生成>使用するランライムライブラリ」をマルチスレッド版に変更しておきます。

コンパイルエラーが出る!

DLL版を使うと、「DLLインタフェイスなんちゃら」のwarningが出る

具体的には、
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' の宣言を確認してください。
とりあえず無視?

「LIBCMTが競合している」というwarningが出る

#define _STLP_DEBUG 1 よりも先にSTLportのヘッダを読み込んでいるのが問題。 <windows.h>などからも間接的にインクルードされます。 何よりも先に#defineしてください。

「InterlockedXXXのエラー」が出る

PlatformSDKを使っていて、STLP_NEW_PLATFORM_SDKを#defineするのを忘れているのが問題です。 INCLUDE/stlport/stl_user_config.hを編集する必要があります。

サンプル

#include <iostream>
int main(int argc, char* argv[])
{
    std::cout << "hello, world." << std::endl;
    return 0;
}
をマルチスレッドの設定でコンパイルしてみました。

設定ファイルサイズ
_STLP_NO_OWN_IOSTREAMS72KB
_STLP_USE_STATIC_LIB216KB
_STLP_USE_STATICX_LIB216KB
_STLP_USE_DYNAMIC_LIB40KB

やっぱりスタティックリンクすると巨大になりますね……。


2002/04/27