Как начать работать с GTest и CMake

Недавно мне предложили использовать CMake для компиляции моих проектов C ++, и теперь я хотел бы начать писать несколько модульных тестов для своего кода. Я решил использовать утилиту Google Test, чтобы помочь с этим, но мне нужна помощь для начала работы.

Весь день я читал различные руководства и примеры, включая Primer , введение в IBM и несколько вопросов по SO ( здесь и здесь ), а также другие источники, которые я потерял. Я понимаю, что есть много чего, но почему-то все еще испытываю трудности.

В настоящее время я пытаюсь реализовать самый простой тест, чтобы убедиться, что я правильно скомпилировал / установил gtest, и он не работает. Единственный исходный файл (testgtest.cpp) почти точно взят из этого предыдущего ответа:

#include 

#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

и мой связанный CMakeLists.txt выглядит следующим образом:

cmake_minimum_required(VERSION 2.6)
project(basic_test)

# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})

# Add test cpp file
add_executable(runUnitTests
    testgtest.cpp
)

# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})

add_test(
    NAME runUnitTests
    COMMAND runUnitTests
)

Обратите внимание, что я решил вместо этого ссылку на gtest_main предоставления main в конце файла cpp, поскольку я считаю, что это позволит мне легче масштабировать тестирование до нескольких файлов.

При сборке сгенерированного файла .sln (в Visual C ++ 2010 Express) я, к сожалению, получаю длинный список ошибок в форме

2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream >::~basic_iostream >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)

, что, как мне кажется, означает, что я не могу успешно подключиться к библиотекам gtest.Я убедился, что при компоновке с библиотеками отладки я попытался создать в режиме отладки.

РЕДАКТИРОВАТЬ

Покопавшись, я думаю, что моя проблема связана с типом библиотеки, в которую я встраиваю gtest. При сборке gtest с помощью CMake, если BUILD_SHARED_LIBS не отмечен, и я связываю свою программу с этими файлами .lib, я получаю упомянутые выше ошибки. Однако, если отмечен BUILD_SHARED_LIBS , то я создаю набор файлов .lib и .dll. Теперь при компоновке с этими .lib-файлами программа компилируется, но при запуске жалуется, что не может найти gtest.dll.

В чем разница между библиотекой SHARED и библиотекой без SHARED , и если я выберу вариант «не общий», почему это не работает? Есть ли параметр в CMakeLists.txt для моего проекта, который мне не хватает?

112
задан Vadim Kotov 20 August 2018 в 11:00
поделиться