Недавно меня продали за использование CMake для компиляции моих проектов C++, и теперь я хотел бы начать писать некоторые модульные тесты для моего кода. Я решил использовать утилиту Google Test, чтобы помочь с этим, но мне нужна помощь в начале работы.
Весь день я читал различные руководства и примеры, в том числе Учебник для начинающих, введение в 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)" ([email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in gtestd.lib(gtest-all.obj)
что, я думаю, означает, что я не могу успешно связываться с библиотеками gtest. Я убедился, что при связывании с отладочными библиотеками я попытался встроить режим отладки.
EDIT
Сделав еще несколько копаний, я думаю, что моя проблема связана с типом библиотеки, в которую я встраиваю gtest. При сборке gtest с CMake, если BUILD_SHARED_LIBS
не проверен, и я связываю свою программу с этими .lib файлами, я получаю ошибки, упомянутые выше. Однако, если флажок BUILD_SHARED_LIBS
установлен, я создаю набор файлов .lib и .dll. При связывании этих .lib файлов программа компилируется, но при запуске жалуется, что не может найти gtest.dll.
В чем различия между библиотекой SHARED
и не SHARED
, и если я выбрал не общий доступ, почему он не работает? Есть ли в CMakeLists.txt вариант для моего проекта, который мне не хватает?