VisualStudioとCMakeでGoogle testをビルドする(2)
ビルドしたGoogle testをVisualStudioで使ってみる

2021年2月13日

どもです。
前回のエントリで、google testをビルドしました。
今回は、このgoogle testをVisualStudioで使ってみます。

1.開発環境

開発環境は、下表の通り出です。
基本的な構成は、前回と同じです。

項目 内容
OS Windows10 Pro(1909)
CPU i7-8700
メモリ 16GB
IDE VisualStudioCommnuity 2019
version 16.5.1
google test 1.10.0(GitHub)

2.VisualStudioでgoogle testを使う

まず、google testを使用するためのVisualStudioのプロジェクトを作成します。

2.1.VisualStudioのプロジェクト作成

google testを使用するプロジェクトを作成します。
VisualStudioを起動した際に表示されるウィザード画面で、「新しいプロジェクトの作成」を選択します。
re_google_test_002_001
「新しいプロジェクトの作成」画面が表示されるので、ここでは「Windowsデスクトップウィザード」を選択して「次へ」をクリックします。
re_google_test_002_002
「新しいプロジェクトを作成します」画面が表示されます。
(プロジェクト名には、テキトーな名前を入力してください。)
プロジェクト名を入力したら、「作成」をクリックして完了です。
re_google_test_002_003

2.2.VisualStudioのプロジェクトの設定

プロジェクトを作成したら、次はプロジェクトの設定を行います。
VisualStudioの「ソリューションエクスプローラ」のプロジェクトで右クリックして「プロパティ」を選択し、「プロパティページ」を表示します。

2.2.1.プラットフォームの選択

まず、プロジェクトのプラットフォームを選択します。
「プロパティページ」の「プラットフォーム」で、「x64」/「Win32」/「全てのプラットフォーム」のいずれかを選択します。
どれを選択するかは、テスト対象のプラットフォームなどに基づいて判断してください。
re_google_test_002_004

2.2.2.インクルードディレクトリの設定

次に、インクルードディレクトリを設定します。
インクルードディレクトリには、前回のエントリで、google testを解凍したフォルダ内の「include」ディレクトリを設定します。
設定は、プロパティページの[C/C++]-[全般]-[追加のインクルードディレクトリ]から設定します。
re_google_test_002_005
re_google_test_002_006

2.2.3.ライブラリの設定

インクルドディレクトリの設定が完了したら、リンクするライブラリを設定します。
これは、プロパティページの[リンカー]-[入力]-[追加の依存ファイル]から設定します。
なお指定するライブラリは、構成によって切り替える必要があります。
即ち、Debug構成の場合には、ファイル名に「d」が付与されたモノ、Release構成の場合にはファイル名に「d」が付与されていないモノを設定します。
re_google_test_002_007
re_google_test_002_008

2.2.4.ライブラリのディレクトリの設定

ライブラリを設定したら、そのライブラリが格納されたフォルダを設定します。
設定は、プロパティページの[リンカー]-[全般]-[追加のライブラリディレクトリ]から設定します。
re_google_test_002_009
re_google_test_002_010
以上で設定は終了です。

2.3.ビルド

ここまででビルド設定が完了したので、次はビルドです。
といっても、何か特別なことはしません。
フツーにビルドを行います。
しかし!
ココで実は「ハマる場合」があります。
実際、私はハマりました。
そこで次に、ハマった内容とその対応について書きます。

2.3.1.エラー:1つ目
「_ITERATOR_DEBUG_LEVELの不一致が検出されました。」

ビルドした際に、次のようなエラーメッセージが表示されました。

gtest.lib(gtest-all.obj) : error LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました。値 '0' が 2 の値 '(project_name).obj' と一致しません。
gtest.lib(gtest-all.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MTd_StaticDebug の値 '(project_name).obj' と一致しません。
gtest_main.lib(gtest_main.obj) : error LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました。値 '0' が 2 の値 '(project_name).obj' と一致しません。
gtest_main.lib(gtest_main.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MTd_StaticDebug の値 '(project_name).obj' と一致しません。
LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
(project_name_output).exe : fatal error LNK1319: 4 の不一致が検出されました

この原因は、プロジェクトのビルドの構成とリンクしているビルドの構成が一致していないことです。
即ち、ビルド対象のプロジェクトの構成が「Debug」なのに「Release」構成でビルドしたgoogle testをリンクしている、あるいは「Release」ビルド構成の際に「Debug」構成でビルドしたgoogle testをリンクしている場合に発生します。
ビルド対象のプロジェクトに対応したライブラリをリンクするように設定することで、問題は解決ができます。

2.3.2.エラー:2つ目
「RuntimeLibraryの不一致が検出されました。」

ビルドした際に、次のようなエラーメッセージが表示されました。

gtestd.lib(gtest-all.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 '(project_name).obj' と一致しません。
msvcprtd.lib(MSVCP140D.dll) : error LNK2005: "public: struct _Cvtvec __cdecl std::_Locinfo::_Getcvt(void)const " (?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ) は既に gtestd.lib(gtest-all.obj) で定義されています。
(※長いので省略します)

エラーメッセージ内にもあるように、ランタイムライブラリの設定間違いが原因で発生するエラーです。
ビルド対象のプロジェクトとリンクしているライブラリで、ランタイムライブラリの設定が一致していない場合に発生します。
対処としては、ビルド対象のプロジェクトとリンクしているライブラリのランタイムライブラリの設定を一致させることです。
ランタイムライブラリの設定は、ビルド対象のプロジェクトのプロパティページの[C/C++]-[コード生成]-[ランタイムライブラリ]から設定します。
(私は、「マルチスレッドデバッグDLL(/MDd)」に設定しました。)
re_google_test_002_011

3.まとめ

今回は、前回のエントリでビルドしたgoogle testをVisualStudioで使用するためのプロジェクトの設定について書きました。
ちょっとハマってしまいましたが、何とか無事にプロジェクトをビルドすることができました。
ハマってしまった内容は、中々出くわすことが無いので、原因に気が付いて対処するまでに少し時間がかかってしまいました。
このエントリが、同じ内容にハマってしまった方の助けに少しでもなれば良いかなと思います。
ではっ!