質問: ### 前提・実現したいこと テスト駆動開発を勉強しようと思い、Visual StudioでGoogle Testを使用しようとしましたが、実行できません。 インクルードディレクトリ、スタティックリンクライブラリの設定は行っており、コンパイルまでは通っています。 以下のリンクエラーが発生したまま、足踏みが続いている状況です。 ### 発生している問題・エラーメッセージ ``` エラー LNK2019 未解決の外部シンボル _main が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました。 TestDrivenDevelopmentChapter1 c:\Users\***\documents\visual studio 2017\Projects\TestDrivenDevelopmentChapter1\TestDrivenDevelopmentChapter1\MSVCRTD.lib(exe_main.obj) 1 ``` ### 該当のソースコード 「テスト駆動開発」の6ページまでのコードをC++に落とし込んだものになります。 MoneyTest.cpp(testTestDrivenDevelopmentChapter1プロジェクト内) ``` #include #include TEST(MoneyTest, Multiplication) { Dollar five(5); five.times(2); EXPECT_EQ(10, five.amount); } ``` Dollar.h(TestDrivenDevelopmentChapter1プロジェクト内) ``` #pragma once class Dollar { public: Dollar(int amount); ~Dollar(); void times(int multiplier); int amount; }; ``` Dollar.cpp(TestDrivenDevelopmentChapter1プロジェクト内) ``` #include "Dollar.h" Dollar::Dollar(int amount) { } Dollar::~Dollar() { } void Dollar::times(int multiplier) { } ``` ### 試したこと エラーメッセージから推測するには、エントリポイントが見つからないのだと思います。 そこで、以下を試しました。 ・MoneyTest.cppにInitGoogleTest()、RUN_ALL_TEST()を記述したmain関数を書く →状況変わらず ・Dollar.cppに空のmain関数を書く →当然ながら何もしないmain関数が実行されて終了する(テスト結果は表示されず) ・Dollar.cppにInitGoogleTest()、RUN_ALL_TEST()を記述したmain関数を書く →InitGoogleTest()、RUN_ALL_TEST()の定義が見つからないコンパイルエラーが出る ### 補足情報(言語/FW/ツール等のバージョンなど) 言語:C++ 開発環境:Visual Studio Community 2017 テストフレームワーク:Google Test 1.7.0
回答: 自己解決しました。 結論から言えば、プロジェクト本体とテストプロジェクトを分けず、同一のプロジェクトで扱う必要があったようです。 以下、TestDrivenDevelopmentChapter1(Dollar側)を「テストされる側のプロジェクト」、 testTestDrivenDevelopmentChapter1(MoneyTest側)を「テストする側のプロジェクト」と呼称し、 その後の経過を述べていこうと思います。 ### 件のリンクエラーについて これについては、やはりmain関数が見つからないことが原因のようでした。 ただし、テストする側のプロジェクトではなく、テストされる側のmain関数だったようです。 そのためにDollar.cppにmain関数を書いた時にはリンクも通り実行できたのでしょう。 ただしGoogle Testの実行という目的は達せられないため、プロジェクトの実行順序を変更する必要がありました。 ソリューションのプロパティから[共通プロパティ]-[スタートアッププロジェクト]に移動し、 [シングルスタートアッププロジェクト]をテストする側のプロジェクトにする必要があったようです(ソリューション名と同一なため、デフォルトではテストされる側のプロジェクトになっていました)。 その後、今度は他のリンクエラーが出る形になりました。 ### スタートアッププロジェクト変更後の各種リンクエラー まず、大量の(私の環境では508もの)LNK2005エラーが出力されました。 これについては検索すれば即座に解決しました。コード生成のランタイムライブラリをMTdにし、 リンクするスタティックリンクライブラリをDebugモードのものにして解決しました。 今度はDollarのコンストラクタ、デストラクタ、およびtimes関数について、LNK2019エラーが出力されました。 どうやらテストされる側のファイルとテストする側のファイルが同じプロジェクトに存在する必要があるようです。 ですので、epistemeさんのアドバイスに従い、テストする側のプロジェクトに Dollar.hおよびDollar.cppを追加し、ようやくテストの結果が表示されました。 ### テストする側のプロジェクト削除 ただ、こうしなくてはいけないのではテストする側のプロジェクトが存在する意味がありません。 テストする側のプロジェクトを削除し、テストされる側のプロジェクトにMoneyTest.cppを追加、 そしてテストする側に行っていた各種インクルード・リンク設定をテストされる側のプロジェクトに行いました。 その際、epistemeさんのアドバイスのように . にインクルードパスを通す必要があるようです(MoneyTest.cppはテストする側のプロジェクトディレクトリ内にあるので)。 この構成にすれば、テストされる側のmain関数はそもそも問題にならなくなります(epistemeさんの構成はおそらくこの形なのだと思います)。 結局、冒頭にも述べたように、プロジェクト本体とテストプロジェクトを分けてはいけないというのが今回の問題の本質だったようです。 検索した限りでは両者を各個プロジェクトに分離している構成が多く見られるのですが、この点、腑に落ちないところです。 ともあれ、真摯に対応してくださったepistemeさん、hmmmさん、誠にありがとうございました。