Как настроить Google C ++ Testing Framework (gtest) с Visual Studio 2005


82

Это не задокументировано на веб-сайте, и у людей, похоже, возникают проблемы с настройкой фреймворка. Может ли кто-нибудь показать пошаговое введение для установки образца проекта?


Рад, что кто-то спросил ...
Boyang

Ответы:


44

То, что сказал Арлахарен, было в основном правильным, за исключением того, что он не упомянул ту часть, которая объясняет ваши ошибки компоновщика. Прежде всего, вам нужно создать свое приложение без CRT в качестве библиотеки времени выполнения. Вы всегда должны делать это в любом случае, поскольку это действительно упрощает распространение вашего приложения. Если вы этого не сделаете, то всем вашим пользователям понадобится установленная библиотека времени выполнения Visual C ++, а те, кто этого не сделает, будут жаловаться на загадочную пропажу DLL в их системе ... из-за дополнительных нескольких сотен килобайт, которые стоит связать. ЭЛТ статически, вы сэкономите себе много головной боли позже в поддержке (поверьте мне, я выучил это на собственном горьком опыте!).

В любом случае, чтобы сделать это, вы переходите к свойствам цели -> C / C ++ -> Генерация кода -> Библиотека времени выполнения, и она должна быть установлена ​​как «Многопоточная» для вашей сборки выпуска и «Многопоточная отладка» для ваша отладочная сборка.

Поскольку GTEST библиотека построена таким же образом, вы должны убедиться , что вы связываете с правильной версией него , или же компоновщик будет тянуть в другой копии библиотеки времени выполнения, что ошибка вы видели (кстати, это не должно иметь значения, используете вы MFC или нет). Вам нужно создать gtest как в режиме отладки, так и в режиме выпуска и сохранить обе копии. Затем вы связываете gtest.lib / gtest_main.lib в сборке Release и gtestd.lib / gtest_maind.lib в сборке Debug.

Кроме того, вам необходимо убедиться, что ваше приложение указывает на каталог, в котором хранятся файлы заголовков gtest (в свойствах -> C / C ++ -> Общие -> Дополнительные каталоги включения), но если вы добрались до ошибки компоновщика, я предполагаю что вам уже удалось исправить эту часть, иначе вам придется сначала разобраться с гораздо большим количеством ошибок компилятора.


Я выучил это «на собственном горьком опыте», потратив на это весь свой день. Наконец, у меня все заработало, построив их обоих одинаковым образом. Спасибо за ответ, но уже поздно. : / И, кстати, ваше предложение CRT неверно, но у меня недостаточно места, чтобы обсудить это. См tinyurl.com/dj5k7k
knaser

хорошо, если вы выучили это "на собственном горьком опыте", вы можете забыть, что DLL-файлы среды выполнения CRT называются "распространяемыми" ... так что ясно, что вам нужно распространять их самостоятельно ... либо путем включения установщика распространяемых файлов в свой собственный установщик , или просто извлекая необходимые dll в свою папку установки ... (включая файл манифеста, если необходимо)
smerlin

1
Статическая привязка CRT означает, что ваше приложение не будет
получать

106

(Эти инструкции заставляют среду тестирования работать для конфигурации отладки. Применение того же процесса к конфигурации выпуска должно быть довольно тривиальным.)

Получите Google C ++ Testing Framework

  1. Загрузите последнюю версию gtest framework
  2. Разархивировать в C:\gtest

Создайте библиотеки Framework

  1. Открыть C:\gtest\msvc\gtest.slnв Visual Studio
  2. Установите для конфигурации значение «Отладка»
  3. Построить решение

Создайте и настройте свой тестовый проект

  1. Создайте новое решение и выберите шаблон Visual C ++> Win32> Win32 Console Application.
  2. Щелкните правой кнопкой мыши только что созданный проект и выберите Свойства.
  3. Измените конфигурацию на отладочную.
  4. Свойства конфигурации> C / C ++> Общие> Дополнительные каталоги включения: Добавить C:\gtest\include
  5. Свойства конфигурации> C / C ++> Генерация кода> Библиотека времени выполнения: если ваш код связан с динамической DLL, выберите Многопоточная отладочная DLL (/ MDd). Если нет, выберите Многопоточная отладка (/ MTd).
  6. Свойства конфигурации> Компоновщик> Общие> Дополнительные каталоги библиотек: добавьте C:\gtest\msvc\gtest\Debugили C:\gtest\msvc\gtest-md\Debug, в зависимости от расположения gtestd.lib
  7. Свойства конфигурации> Компоновщик> Ввод> Дополнительные зависимости: Добавить gtestd.lib

Проверка того, что все работает

  1. Откройте cpp в тестовом проекте, содержащем main()функцию.
  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
это был отличный гид! Мне удалось добиться успеха, но я бы добавил туда еще одно замечание: тестовый проект и библиотека gtest должны быть построены с одним и тем же параметром генерации кода, либо оба являются / MDd, либо оба / MTd, иначе будет быть кучей ошибок связывания.
Кирилл

1
Примечание: кто бы ни пытался реализовать эту аналогичную реализацию с Microsoft Visual Studio .Net 2003, библиотеки Google Test Framework автоматически устанавливают для библиотеки времени выполнения значение « Однопоточная отладка » для режима отладки и « Однопоточная » для режима выпуска и как насколько я испытал, возможность его изменения из генерации кода недоступна. Итак, убедитесь, что вы выбрали однопоточную опцию в качестве библиотеки времени выполнения в вашем проекте. Помимо этого, этот простой и короткий учебник отлично подойдет!
Neophile

Это первое из пяти руководств, которые работали и не пропагандировали плохую практику. Я был бы рад, если бы это охватывало важный аспект привязки тестового проекта к исходному проекту ... 30+ сайтов спустя, я не нашел рабочего ответа. Я потратил на это 3 дня.
person27

Я удалил значение в «Свойства проекта> Свойства конфигурации> C / C ++> Библиотека времени выполнения», и оно сработало
Манохар Редди Поредди


5

Создав gtest, я сделал вот что:

  1. Добавьте \ mypath \ gtest-1.0.1 \ Debug (или Release) в Общие свойства-> Компоновщик-> Общие-> Дополнительные каталоги библиотек
  2. Добавьте gtest.lib и gtest_main.lib в Общие свойства-> Linker-> Input-> Additional Dependencies

После этого я просто пишу свои тесты, используя 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): error LNK2005: __encode_pointer уже определен в msvcrt.lib (MSVCR80.dll) О, кстати, я Пытаюсь написать тесты для кода MFC.
Knaser

Сожалею. Не думаю, что смогу вам здесь помочь. По какой-то причине я не получаю этих ошибок ссылок. Вы пробовали создать просто тест hello world с помощью gtest?
Arlaharen

gtest_main.libсодержит mainфункцию по умолчанию , поэтому вы, вероятно, не захотите включать ее, если mainявно написали свою собственную .
Groo

5

Если вы не хотите писать свой собственный main () для тестов, вы можете использовать функцию main (), определенную в gtest_main.lib, но тогда вы получите ошибки компоновщика «Точка входа должна быть определена» в VS2012. В вашем тестовом проекте установите ProjectProperties-> Linker-> System-> SubSystem на «Консоль», поскольку это заставит VS2012 искать точку входа с именем «main ()» и найдет ее в gtest_main.lib (при условии, что вы связали это правильно).


2

В Microsoft Visual Studio неправильно настроенный тип библиотеки времени выполнения вызывает ошибки связи.

VS 2005 (и 2008) по умолчанию использует многопоточную DLL или многопоточную отладочную DLL. Но библиотека Google Test по умолчанию использует многопоточную или многопоточную среду отладки.

Итак, выберите подходящий тип библиотеки времени выполнения для тестовой библиотеки Google. (в свойствах конфигурации -> генерация кода -> библиотека времени выполнения).


какая подходящая среда выполнения? (Доктор медицины или другой)
Рамадир Сингх
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.