2012年3月11日日曜日

Visual Studio 11 Beta で Google Test を使う

Visual Studio 11 Beta が公開されましたね。
そこで Visual Studio 11 Beta でも Google Test を使ってみようと思います。

今回の元ネタは、Google グループの Google C++ Testing Framework のこちらの投稿です。
備忘録としてブログにまとめておこうと思います。

プロジェクトの準備
まずは、ダウンロードページより取得した Google Test を解凍します。
解凍したフォルダの中に msvc フォルダがあり、そこの gtest.sln を Visual Studio 11 で開きます。
(Visual Studio 11 Beta のインストールは済ませておいてください。)

プロジェクトのアップグレード(変換)ダイアログが出るので、
アップグレードします。
プロジェクトが正常に読み込まれたら、準備完了です。

ビルド
F7 キーを押して終わり。とはいきません・・・
error C2977: 'std::tuple' : テンプレート 引数の数が多すぎます
error C3203: 'tuple' : 非特殊クラス テンプレート は、テンプレート 引数として テンプレート パラメーター 'T' に使用できません。実際の型を指定してください
とか
error C2955: 'testing::internal::ParamIteratorInterface' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
というエラーがでます。

一番簡単な対処方法は GTEST_HAS_TR1_TUPLE=0 としてしまうことです。
ただし、こうすると値をパラメータ化したテストで Combine が使えなくなってしまいます。

gtest-port.h
Combine を使えるようにするために、gtest/internal/gtest-port.h を編集します。
まずは、MSVC11 の <tuple> は名前空間が異なっているため、対応します。
gtest-port.h の 506 行目に以下を付け足します。
#  if defined(_MSC_VER) && _MSC_VER >= 1700
namespace std { namespace tr1 { using std::tuple; } }
#  endif

次に、Variadic Templates の上限を増やします。
えっ、と思う方もいるかもしれませんが、そういうもんだと思ってください。

gtest-port.h の 38 行目あたりに以下を付け足します。
#if defined(_MSC_VER) && _MSC_VER == 1700
#  ifndef _VARIADIC_MAX
#    define _VARIADIC_MAX 10
#  elif _VARIADIC_MAX < 9
#    define GTEST_HAS_TR1_TUPLE 0
#  endif
#endif
インクルード順の関係で、_VARIADIC_MAX がすでに定義されていたら、残念ながら使えないようにしています。

もし、確実に使いたい場合は
プロジェクトのプロパティからプリプロセッサの定義に _VARIADIC_MAX=10 を追加してください。

以上の対処でビルドエラーは解消されたはずです。
あとは今まで通りに使えると思います。

今回はここまでです。それでは。

0 件のコメント:

コメントを投稿