Visual StudioでGoogle Testが実行できない
- 評価
- クリップ 0
- VIEW 372
前提・実現したいこと
テスト駆動開発を勉強しようと思い、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 <gtest/gtest.h>
#include <Dollar.h>
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
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
+1
自己解決しました。
結論から言えば、プロジェクト本体とテストプロジェクトを分けず、同一のプロジェクトで扱う必要があったようです。
以下、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さん、誠にありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
「テスト駆動開発」の6ページまでのコードをC++に落とし込んだものになります。
この本にはmain関数の記載はなかったんでしょうか?
・MoneyTest.cppにInitGoogleTest()、RUN_ALL_TEST()を記述したmain関数を書く
→状況変わらず
これでできるような気がしますが、Main.cppと別ファイルに分けてみてはどうですか?
Main.cpp
#include <gtest/gtest.h>
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
gtest-packageのgoogletest/src にある gtest-all.cc と gtest_main.cc をプロジェクトに追加して一緒にコンパイル/リンクするだけなんぢゃがの。
- console-application でプロジェクト作成
- googletest-release-1.7.0/include と googletest-release-1.7.0/src そして . にinclude-pathを通す
- プロジェクトに googletest-release-1.7.0/src/gtest_main.cc および gtest-all.cc を追加する
- テストおよびテスト対象(~.h,~.cpp)を追加
これだけでできたです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 91.05%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/12/30 13:17
2017/12/30 15:36
現在の目的はGoogle Testを使ってC++でのテスト駆動開発を勉強することでしたので、当面は現在の1プロジェクト構成で進めてみようと思います。
ただ、現在の構成ではソリューション・プロジェクトが大きくなった時に限界が来るだろうことも感じているので、
その際にはhmmmさんのアドバイスが役に立ちそうです。