Недавно мне предложили использовать 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 для моего проекта, который мне не хватает?