Visual Studio2005でGoogleC ++テストフレームワーク(gtest)を設定する方法


82

それはウェブサイトに文書化されておらず、人々はフレームワークのセットアップに問題を抱えているようです。誰かがサンプルプロジェクトセットアップのステップバイステップの紹介を見せてもらえますか?


喜んで誰かが...尋ねた
Boyang

回答:


44

Arlaharenが言ったことは、リンカーのエラーを説明する部分を省略したことを除いて、基本的に正しいものでした。まず、ランタイムライブラリとしてCRTを使用せずにアプリケーションをビルドする必要があります。アプリケーションの配布が本当に簡単になるので、とにかくこれを常に行う必要があります。これを行わない場合、すべてのユーザーはVisual C ++ランタイムライブラリをインストールする必要があります。そうでないユーザーは、システムに不思議なDLLがないことについて不平を言うでしょう...リンクにかかる余分な数百キロバイトCRTを静的に使用すると、後でサポートする際の頭痛の種を大幅に減らすことができます(これについては、私を信じてください。難しい方法で学びました!)。

とにかく、これを行うには、ターゲットのプロパティ-> C / C ++->コード生成->ランタイムライブラリに移動し、リリースビルドでは「マルチスレッド」に設定し、リリースビルドでは「マルチスレッドデバッグ」に設定する必要があります。デバッグビルド。

GTESTライブラリは同じ方法で構築されているので、あなたはあなたが正しいバージョンにリンクされているようにする必要があり、それ、または他のリンカは、あなたが(ところで見誤りである、ランタイムライブラリの別のコピーでこれを引っ張ってきますMFCを使用しているかどうかに関係なく、違いはありません)。デバッグモードとリリースモードの両方としてgtestをビルドし、両方のコピーを保持する必要があります。次に、リリースビルドではgtest.lib / gtest_main.libにリンクし、デバッグビルドではgtestd.lib /gtest_maind.libにリンクします。

また、アプリケーションがgtestヘッダーファイルが保存されているディレクトリを指していることを確認する必要があります(プロパティ-> C / C ++->一般->追加のインクルードディレクトリ)が、リンカーエラーが発生した場合は、すでにこの部分を正しくすることができたということです。さもないと、最初に対処しなければならないコンパイラエラーがもっとたくさんあるでしょう。


私はこれを「難しい方法」で学び、一日中過ごしました。両方を同じ方法で構築した後、ようやく動作しました。ご回答ありがとうございますが、遅いです。:/ところで、あなたのCRTの提案は間違っていますが、これについて議論するのに十分なスペースがありません。tinyurl.com/dj5k7k
knaser

それを「難しい方法」で学んだ場合、CRTランタイムdllが「再配布可能」と呼ばれることを忘れてしまう可能性があります...したがって、自分で再配布する必要があることは明らかです...自分のインストーラーにredistインストーラーを含めることによって、または必要なdllを独自のインストールフォルダに抽出するだけで...(必要に応じてマニフェストファイルを含む)
smerlin 2010年

1
CRTを静的にリンクするということは、アプリケーションがエクスプロイト/セキュリティの修正を
取得し

106

(これらの手順により、テストフレームワークがデバッグ構成で機能するようになります。同じプロセスをリリース構成に適用するのは非常に簡単です。)

Google C ++テストフレームワークを入手する

  1. 最新のgtestフレームワークをダウンロードする
  2. に解凍 C:\gtest

フレームワークライブラリを構築する

  1. VisualStudioC:\gtest\msvc\gtest.slnで開く
  2. 構成を「デバッグ」に設定します
  3. ビルドソリューション

テストプロジェクトを作成して構成する

  1. 新しいソリューションを作成し、テンプレートVisual C ++> Win32> Win32コンソールアプリケーションを選択します
  2. 新しく作成したプロジェクトを右クリックして、[プロパティ]を選択します
  3. 構成をデバッグに変更します。
  4. 構成プロパティ> C / C ++>一般>追加のインクルードディレクトリ:追加 C:\gtest\include
  5. 構成プロパティ> C / C ++>コード生成>ランタイムライブラリ:コードがランタイムDLLにリンクしている場合は、マルチスレッドデバッグDLL(/ MDd)を選択します。そうでない場合は、マルチスレッドデバッグ(/ MTd)を選択します。
  6. 構成プロパティ>リンカー>一般>追加のライブラリディレクトリ:gtestd.libの場所に応じて、C:\gtest\msvc\gtest\Debugまたはを追加しC:\gtest\msvc\gtest-md\Debugます
  7. 構成プロパティ>リンカー>入力>追加の依存関係:追加 gtestd.lib

すべてが機能することを確認する

  1. main()関数を含むテストプロジェクトでcppを開きます。
  2. 次のコードを貼り付けます。

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
  3. デバッグ>デバッグの開始

すべてが機能した場合は、コンソールウィンドウが表示され、単体テストの結果が表示されます。


9
それは素晴らしいガイドでした!ボールを転がすことができましたが、そこにもう1つメモを追加します。テストプロジェクトとgtestライブラリは、同じコード生成オプションでビルドする必要があります。どちらも/ MDdであるか、両方が/ MTdであるか、そうでない場合はリンクエラーの束になります。
キリル2011年

1
注: Microsoft Visual Studio .Net 2003でこの同様の実装を実行しようとすると、Google Test Frameworkライブラリは、ランタイムライブラリをデバッグモードの場合は「シングルスレッドデバッグ」に、リリースモードの場合は「シングルスレッド」に自動的にデフォルト設定します。私が試した限りでは、コード生成から変更するオプションは利用できません。したがって、プロジェクトのランタイムライブラリとしてシングルスレッドオプションを選択していることを確認してください。それ以外は、このシンプルで短いチュートリアルは完璧に機能します!
ネオフィリア2011年

これは、機能し、悪い習慣を促進しなかった5つのチュートリアルの最初のものです。これがテストプロジェクトを元のプロジェクトにリンクする重要な側面をカバーしていれば、私はそれが大好きです... 30以上のサイトの後、私は実用的な答えを見つけられませんでした。私はそれに3日を費やしました。
person27 2016年

「プロジェクトプロパティ>構成プロパティ> C / C ++>ランタイムライブラリ」の値を削除しましたが、機能しました
Manohar Reddy Poreddy 2017


5

gtestを構築した後、これは私が行ったことです。

  1. \ mypath \ gtest-1.0.1 \ Debug(またはRelease)を[Common Properties]-> [Linker]-> [General]-> [Additional LibraryDirectories]に追加します
  2. gtest.libとgtest_main.libを[共通のプロパティ]-> [リンカー]-> [入力]-> [追加の依存関係]に追加します

その後、必要に応じてTESTまたはTEST_Fを使用してテストを記述し、メイン関数と一緒にコンパイルします。

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

5
たくさんのリンカーエラーが発生します:gtest.libですでに定義されています...例:1> LIBCMT.lib(tidtable.obj):エラーLNK2005:__ encode_pointerはmsvcrt.lib(MSVCR80.dll)ですでに定義されていますああ、ところで、私はMFCコードのテストを作成しようとしています。
knaser 2009

ごめんなさい。私はそこであなたを助けることができないと思います。何らかの理由で、これらのリンクエラーは発生しません。gtestを使用してHelloWorldテストだけを構築しようとしましたか?
Arlaharen 2009

gtest_main.libデフォルトのmain関数が含まれているため、独自の関数をmain明示的に記述した場合は、おそらくこの関数を含めたくないでしょう。
Groo 2016年

5

テスト用に独自のmain()を作成したくない場合は、gtest_main.libで定義されているmain()関数を使用できますが、VS2012で「エントリポイントを定義する必要があります」というリンカーエラーが発生します。テストプロジェクトで、ProjectProperties-> Linker-> System-> SubSystemを "Console"に設定します。これにより、VS2012は "main()"というエントリポイントを検索し、gtest_main.libで検索します(リンクしている場合)。適切に)。


2

Microsoft Visual Studioでは、ランタイムライブラリタイプが正しく構成されていないと、リンクエラーが発生します。

VS 2005(および2008)は、デフォルトとしてマルチスレッドDLLまたはマルチスレッドデバッグDLLを使用します。ただし、Google Testライブラリは、デフォルトとしてMulithreadedまたはMulithreadedデバッグランタイムを使用します。

したがって、Googleテストライブラリに適切なランタイムライブラリタイプを選択してください。([構成プロパティ]-> [コード生成]-> [ランタイムライブラリ])。


適切なランタイムは何ですか?(MDまたはその他)
Ramadheer Singh 2010

0

多くのエラーは、修正するのに時間がかかりました。

簡単な手順は次のとおりです。

#Googletest ZIPファイルをhttps://github.com/google/googletestからダウンロードします

#Googletest VisualStudioソリューション

Open    C:\googletest\googletest\msvc\2010\gtest.sln
    Change "Solution configuration"
        from "Debug" to "Release"
    Build Solution
        creates gtest.lib

#あなたのプロジェクト:

Project Properties > Configuration Properties > VC++ Directories > Include Directories
    append the following:       ;C:\googletest\googletest\include

Project Properties > Configuration Properties > Linker > General > Additional Library Directories > 
    append the following:           ;C:\googletest\googletest\msvc\2010\gtest\Win32-Release

Project Properties > Configuration Properties > C/C++ > Runtime Library
    Remove the value of the above. (or match it to Googletest project)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.