EASTLをVisual Studioで使える状態に持って行く話です。急いで書いたので、文章がいつもに増して荒っぽいですがお許しください。
EASTL単体は、githubのpaulhodge/EASTLで公開されています。しかし、これにはMakefileも何もありませんのでちょっと困ります。
そこで、forkを見てみると、CMake用のファイルを追加しているものを見つけました: take-cheeze/EASTL。CMakeを使えばVisual Studioソリューションも簡単に生成できるに違いないということで、今回はこちらを使うことにします。CMakeについては特に解説しませんので、興味ある方は各自調べてください。
git cloneしてもよいのですが、今回はとりあえずアーカイブの形でダウンロードしました。Downloadsをクリックすると、tar.gzまたはzipでダウンロードできます。適当なフォルダに解凍しておきましょう。
さて、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 2.8→CMake (cmake-gui)でCMakeを起動します。
Where is the source code:の欄にさっき解凍したフォルダ(CMakeLists.txtやEASTL.cmakeがあるフォルダ)を指定します。Browse Source…から指定するのが楽だと思います。
次に、Where to build the binariesを入力します。こちらは出力先(VSソリューションなど)が置かれるフォルダになります。画像にあるように、私はsource codeのディレクトリの下にbuild-msvc10というフォルダを作ることにしました。2つを入力したら、Configureボタンをクリックします。Build directoryを作成するかと聞かれたらYesを押しておきましょう。すると何やら作業が始まりますが、少し経つと止まります。
するとこんな風にName/Valueの欄に項目が増えています。CMAKE_ISNTALL_PREFIXといういかにもな名前ですが、特に気にする必要はなさそうです。何か適切な値を設定すべきかなと思い、画像のようにValueを書き換えておきましたが、このディレクトリ(P:/EASTL)が作られることはありませんでした。そして、Generateをクリックします。また、新たなダイアログが表示されます。これは、ビルドに何を使用するかの設定です。私はVisual C++ 2010を使うのでVisual Studio 10を選びます。
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を定義してください。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ EASTLをビルドする(CMakeでVisual Studio)