Недавно мне предложили использовать CMake для компиляции моих проектов на C ++, и теперь я хотел бы начать писать несколько модульных тестов для своего кода. Я решил использовать утилиту Google Test, чтобы помочь с этим, но мне нужна помощь для начала работы.
Весь день я читал различные руководства и примеры, включая Primer , введение в IBM и некоторые вопросы по SO ( здесь и здесь ), а также другие источники, которые я потерял. Я понимаю, что есть много чего, но почему-то все еще испытываю трудности.
В настоящее время я пытаюсь реализовать самый простой тест, чтобы убедиться, что я правильно скомпилировал / установил gtest, и он не работает. Только исходный файл (testgtest.cpp) берется почти точно от этого предыдущего ответа:
#include <iostream>
#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<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(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.
В чем разница между библиотекой a SHARED
и not SHARED
, и если я выберу вариант not shared, почему она не работает? Есть ли вариант в CMakeLists.txt для моего проекта, который мне не хватает?
enable_testing()
делать?
ExternalProject_Add
вместоadd_subdirectory
. См. Этот ответ для подробностей.