EASTLをVisual Studioで使える状態に持って行く話です。急いで書いたので、文章がいつもに増して荒っぽいですがお許しください。

EASTL単体は、githubのpaulhodge/EASTLで公開されています。しかし、これにはMakefileも何もありませんのでちょっと困ります。

そこで、forkを見てみると、CMake用のファイルを追加しているものを見つけました: take-cheeze/EASTL。CMakeを使えばVisual Studioソリューションも簡単に生成できるに違いないということで、今回はこちらを使うことにします。CMakeについては特に解説しませんので、興味ある方は各自調べてください。


git cloneしてもよいのですが、今回はとりあえずアーカイブの形でダウンロードしました。Downloadsをクリックすると、tar.gzまたはzipでダウンロードできます。適当なフォルダに解凍しておきましょう。

githubのDownloadsボタン

githubのレポジトリトップページの画面右側にはDownloadsボタンがある

さて、CMakeをインストールします。CMake – Cross Platform MakeからDownloadをクリックし、Windows (Win32 Installer)の欄のファイルをダウンロードします(私がやったときはcmake-2.8.4-win32-x86.exeでした)。

ダウンロードしたEXEを実行するとインストールが始まります。途中、PATHの追加について聞かれますが、デフォルトのDo not add CMake to the system PATHで良いでしょう。

CMakeのインストール中のPATHの設定を聞かれる画面

CMakeのインストール時のPATHの設定を聞かれる場面


インストールが完了したら、スタート→プログラム→CMake 2.8→CMake (cmake-gui)でCMakeを起動します。

Where is the source code:の欄にさっき解凍したフォルダ(CMakeLists.txtやEASTL.cmakeがあるフォルダ)を指定します。Browse Source…から指定するのが楽だと思います。

CMakeでsource codeとbuild the binariesを入力した段階

CMakeでsource codeとbuild the binariesを入力した段階

次に、Where to build the binariesを入力します。こちらは出力先(VSソリューションなど)が置かれるフォルダになります。画像にあるように、私はsource codeのディレクトリの下にbuild-msvc10というフォルダを作ることにしました。

2つを入力したら、Configureボタンをクリックします。Build directoryを作成するかと聞かれたらYesを押しておきましょう。すると何やら作業が始まりますが、少し経つと止まります。

CMakeでconfiguredをクリックした後、CMAKE_ISNTALL_PREFIXが現れる

CMakeでconfiguredをクリックした後、CMAKE_ISNTALL_PREFIXが現れたところ

するとこんな風にName/Valueの欄に項目が増えています。CMAKE_ISNTALL_PREFIXといういかにもな名前ですが、特に気にする必要はなさそうです。何か適切な値を設定すべきかなと思い、画像のようにValueを書き換えておきましたが、このディレクトリ(P:/EASTL)が作られることはありませんでした。

そして、Generateをクリックします。また、新たなダイアログが表示されます。これは、ビルドに何を使用するかの設定です。私はVisual C++ 2010を使うのでVisual Studio 10を選びます。

CMakeでのgeneratorを指定するダイアログ

CMakeでのgeneratorを指定するダイアログ

CMakeが完了した様子になったらbuild the binariesで指定したフォルダを開きます。EASTL.slnやほかプロジェクトファイルが生成されているはずです。EASTL.slnを開きましょう。


さて、ここでVisual C++ 2010対策に入ります。EAWebKit勉強会中でも話題となりましたが、EABase内のchar16_tとchar32_tというtypedefのせいでVisual C++ 2010ではエラーになる問題があります。VC++ 2010も同じ名前のtypedefを持っているためです。take-cheezeさんもソースコードに対応方法のコメントを残していますが、それはそれで問題があると思うので私は違う方法を紹介します(take-cheezeさんの方法の問題は次回以降のエントリで)。

プロジェクトEASTLのプロパティを開きます。構成の欄で「すべての構成」を選びます。

  • C/C++→プリプロセッサ→「プリプロセッサの定義」の欄に「EA_COMPLER_IS_CPLUSPLUS_0X;」を付け足します。;が区切りなので、忘れないよう注意してください。
  • C/C++→詳細設定→「必ず使用されるインクルードファイル」に「yvals.h」を追加します。ついでに「既定ライブラリ名の省略」を「はい (/Zl)」に変えておくことをおすすめします(この説明も次回以降)。

以上のことが済んだら、OKを押して閉じます。ここまでVisual C++ 2010対策でした。

なお、Visual Studio 2005や2008など、2010より前のバージョンを使っている方も、上記の「既定ライブラリ名の省略」を「はい (/Zl)」とすることをおすすめします。

あとは「ソリューションのビルド」を実行するだけです。私はDebugとRelWithDebInfoの2つをビルドしました。(Releaseを選ばなかった理由は、私がリリースビルドでもデバッグ情報をオンにする派だからです)。できたら、EASTLを展開したディレクトリ(CMakeLists.txtがあるディレクトリ)に戻りましょう。contrib, include, srcのほかにlibディレクトリが増えています。この中にLIBファイルとPDBファイル(デバッグ情報)が出来上がっています。

最後にEASTLを使うプロジェクトでの注意です。先ほどのincludeをインクルードディレクトリに追加し、LIBファイルをリンクするよう設定しただけではエラーになります。paulhodge/EASTLのREADMEに書かれているようにoperator new[]の定義を追加する必要があります。

以下のコードをEASTLを使用するプロジェクトに追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <new>
#define EA_COMPILER_IS_CPLUSPLUS_0X // Visual C++ 2010対策
#include <EASTL/vector.h>
 
void* operator new[](size_t size, const char* pName, int flags,
    unsigned debugFlags, const char* file, int line)
{
    return operator new[](size);
}
void* operator new[](size_t size, size_t alignment, size_t alignmentOffset,
    const char* pName, int flags, unsigned debugFlags, const char* file, int line)
{
    // doesn't support alignment
    return operator new[](size);
}
 
void operator delete[](void* ptr, const char* pName, int flags,
    unsigned debugFlags, const char* file, int line)
{
    operator delete[](ptr);
}
void operator delete[](void* ptr, size_t alignment, size_t alignmentOffset,
    const char* pName, int flags, unsigned debugFlags, const char* file, int line)
{
    // doesn't support alignment
    operator delete[](ptr);
}

もとのREADMEではmallocを使った実装例が書かれていますが、ソースコードを追っかけるとchar配列に対するdelete[]で解放している(EASTL/allocator.h)ので、このようにoperator new[]関数で確保するのがよいと思います。VC++ではmallocでも何も起こりませんでしたが、ほかのコンパイラでは訳分からないエラーの原因ともなりかねません。

あと、引数の対応するdelete[]を定義している理由はC++ Labyrinth placement new と delete (2) — placement deleteを参照してください。

また、Visual C++ 2010では、EASTLのヘッダをインクルードする際に上のコードのようにEA_COMPILER_IS_CPLUSPLUS_0Xを定義してください。


スポンサード リンク

この記事のカテゴリ

  • ⇒ EASTLをビルドする(CMakeでVisual Studio)