Jak skonfigurować Google C ++ Testing Framework (gtest) w programie Visual Studio 2005


Odpowiedzi:


44

To, co powiedział Arlaharen, było w zasadzie słuszne, z wyjątkiem tego, że pominął część wyjaśniającą błędy łącznika. Przede wszystkim musisz zbudować aplikację bez CRT jako biblioteki wykonawczej. Zawsze powinieneś to robić, ponieważ to naprawdę upraszcza dystrybucję aplikacji. Jeśli tego nie zrobisz, wszyscy twoi użytkownicy będą potrzebować zainstalowanej biblioteki Visual C ++ Runtime Library, a ci, którzy tego nie zrobią, będą narzekać na brak tajemniczej biblioteki DLL w ich systemie ... za dodatkowe kilkaset kilobajtów, które kosztuje połączenie CRT statycznie, oszczędzasz sobie później dużo bólu głowy w ramach wsparcia (zaufaj mi w tej kwestii - nauczyłem się tego na własnej skórze!).

W każdym razie, aby to zrobić, przejdź do właściwości celu -> C / C ++ -> Generowanie kodu -> Biblioteka wykonawcza i musi być ustawiony jako „Wielowątkowy” dla kompilacji wydania i „Debugowanie wielowątkowe” dla Twoja kompilacja debugowania.

Ponieważ numeru GTEST biblioteka jest zbudowany w taki sam sposób, trzeba upewnić się, że łączenie przeciwko poprawnej wersji tego lub innego łącznik będzie ciągnąć w innym egzemplarzu biblioteki wykonawczego, którym jest błąd obejrzałeś (btw, to nie powinno robić różnicy, czy używasz MFC, czy nie). Musisz zbudować gtest zarówno jako tryb debugowania, jak i wydania i zachować obie kopie. Następnie łączysz się z gtest.lib / gtest_main.lib w kompilacji wydania i gtestd.lib / gtest_maind.lib w kompilacji debugowania.

Musisz również upewnić się, że Twoja aplikacja wskazuje katalog, w którym przechowywane są pliki nagłówkowe gtest (we właściwościach -> C / C ++ -> Ogólne -> Dodatkowe katalogi dołączania), ale jeśli dostałeś się do błędu linkera, zakładam że już udało ci się poprawić tę część, inaczej musiałbyś najpierw zająć się znacznie większą liczbą błędów kompilatora.


Nauczyłem się tego „na własnej skórze”, spędzając cały dzień. W końcu udało mi się to uruchomić, po zbudowaniu obu w ten sam sposób. Dziękuję za odpowiedź, ale jest późno. : / A tak przy okazji, twoja sugestia CRT jest błędna, ale nie mam wystarczająco dużo miejsca, aby to omówić. Zobacz tinyurl.com/dj5k7k
knaser

cóż, jeśli nauczyłeś się tego w „trudny sposób”, możesz zapomnieć, że pliki DLL środowiska uruchomieniowego CRT są nazywane „redystrybucyjnymi” ... więc jest jasne, że musisz je ponownie rozprowadzić ... albo przez włączenie instalatora redystrybucji do własnego instalatora lub po prostu wyodrębniając potrzebne biblioteki DLL do własnego folderu instalacyjnego ... (w tym plik manifestu, jeśli to konieczne)
smerlin

1
Statyczne łączenie CRT oznacza, że ​​Twoja aplikacja nie będzie wychwytywać luk w zabezpieczeniach / poprawek bezpieczeństwa
paulm

106

(Te instrukcje powodują, że platforma testowa działa dla konfiguracji debugowania. Zastosowanie tego samego procesu do konfiguracji wydania powinno być dość trywialne).

Pobierz platformę testową Google C ++

  1. Pobierz najnowszy framework gtest
  2. Rozpakuj do C:\gtest

Zbuduj biblioteki ramowe

  1. Otwórz C:\gtest\msvc\gtest.slnw programie Visual Studio
  2. Ustaw konfigurację na „Debuguj”
  3. Zbuduj rozwiązanie

Utwórz i skonfiguruj projekt testowy

  1. Utwórz nowe rozwiązanie i wybierz szablon Visual C ++> Win32> Win32 Console Application
  2. Kliknij prawym przyciskiem nowo utworzony projekt i wybierz Właściwości
  3. Zmień konfigurację na debugowanie.
  4. Właściwości konfiguracji> C / C ++> Ogólne> Dodatkowe katalogi dołączania: Dodaj C:\gtest\include
  5. Właściwości konfiguracji> C / C ++> Generowanie kodu> Biblioteka środowiska uruchomieniowego: Jeśli kod jest powiązany z biblioteką DLL środowiska uruchomieniowego, wybierz opcję Wielowątkowa biblioteka debugowania DLL (/ MDd). Jeśli nie, wybierz debugowanie wielowątkowe (/ MTd).
  6. Właściwości konfiguracji> Konsolidator> Ogólne> Dodatkowe katalogi bibliotek: Dodaj C:\gtest\msvc\gtest\Debuglub C:\gtest\msvc\gtest-md\Debug, w zależności od lokalizacji gtestd.lib
  7. Właściwości konfiguracji> konsolidator> dane wejściowe> dodatkowe zależności: Dodaj gtestd.lib

Sprawdzanie, czy wszystko działa

  1. Otwórz cpp w projekcie testowym zawierającym main()funkcję.
  2. Wklej następujący kod:

    #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. Debuguj> Rozpocznij debugowanie

Jeśli wszystko zadziałało, powinieneś zobaczyć okno konsoli i pokazać wyniki testów jednostkowych.


9
to był świetny przewodnik! Udało mi się wprawić w ruch, ale dodałbym jeszcze jedną notatkę: projekt testowy i biblioteka gtest muszą być zbudowane z tą samą opcją generowania kodu, albo oba są / MDd, albo oba są / MTd, w przeciwnym razie będzie być zbiorem błędów w linkowaniu.
Kiril

1
Uwaga: Ktokolwiek próbuje przeprowadzić tę podobną implementację z Microsoft Visual Studio .Net 2003, biblioteki Google Test Framework automatycznie ustawiają bibliotekę wykonawczą na „ Jednowątkowe debugowanie ” dla trybu debugowania i „ Jednowątkowe ” dla trybu wydania i jako o ile wypróbowałem, opcja zmiany go z Generacji kodu nie jest dostępna. Dlatego upewnij się, że jako bibliotekę wykonawczą w projekcie wybrano opcję Jednowątkową. Poza tym ten prosty i krótki samouczek działa idealnie!
Neophile

To pierwszy z pięciu tutoriali, które zadziałały i nie promowały złych praktyk. Chciałbym, żeby obejmowało to ważny aspekt łączenia projektu testowego z oryginalnym projektem ... Ponad 30 witryn później, nie znalazłem działającej odpowiedzi. Spędziłem nad tym 3 dni.
person27

Usunąłem wartość w „Project Properties> Configuration Properties> C / C ++> Runtime Library”, a potem zadziałało
Manohar Reddy Poreddy


5

Po zbudowaniu gtest zrobiłem to:

  1. Dodaj \ mypath \ gtest-1.0.1 \ Debug (lub Release) do Common Properties-> Linker-> General-> Additional Library Directories
  2. Dodaj gtest.lib i gtest_main.lib do Common Properties-> Linker-> Input-> Additional Dependencies

Następnie po prostu piszę swoje testy, używając odpowiednio TEST lub TEST_F i kompiluję je razem z moją główną funkcją:

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

5
Otrzymuję wiele błędów konsolidatora: już zdefiniowane w gtest.lib ... np .: 1> LIBCMT.lib (tidtable.obj): błąd LNK2005: __encode_pointer już zdefiniowany w msvcrt.lib (MSVCR80.dll) Och, btw, ja Próbuję napisać testy dla kodu MFC.
knaser

Przepraszam. Myślę, że nie mogę ci tam pomóc. Z jakiegoś powodu nie otrzymuję tych błędów linków. Czy próbowałeś zbudować tylko test Hello World za pomocą gtest?
Arlaharen

gtest_main.libzawiera funkcję domyślną main, więc prawdopodobnie nie chcesz jej dołączać, jeśli mainjawnie napisałeś własną .
Groo

5

Jeśli nie chcesz pisać własnej funkcji main () do testów, możesz użyć funkcji main () zdefiniowanej w gtest_main.lib, ale wtedy otrzymujesz błędy linkera „Należy zdefiniować punkt wejścia” w VS2012. W projekcie testowym ustaw ProjectProperties-> Linker-> System-> SubSystem na „Console”, ponieważ zmusi to VS2012 do wyszukania punktu wejścia o nazwie „main ()” i znajdzie go w gtest_main.lib (pod warunkiem, że połączyłeś prawidłowo).


2

W programie Microsoft Visual Studio błędnie skonfigurowany typ biblioteki środowiska wykonawczego powoduje błędy łącza.

VS 2005 (i 2008) domyślnie używa wielowątkowej biblioteki DLL lub wielowątkowej biblioteki debugowania DLL. Ale biblioteka Google Test domyślnie używa środowiska uruchomieniowego debugowania Mulithreaded lub Mulithreaded.

Dlatego wybierz odpowiedni typ biblioteki wykonawczej dla biblioteki testowej Google. (we Właściwościach konfiguracji -> Generowanie kodu -> Biblioteka środowiska uruchomieniowego).


jakie jest odpowiednie środowisko wykonawcze? (MD lub inny)
Ramadheer Singh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.