Vor kurzem wurde mir die Verwendung von CMake zum Kompilieren meiner C ++ - Projekte verkauft, und ich möchte jetzt einige Komponententests für meinen Code schreiben. Ich habe mich entschieden, das Google Test-Dienstprogramm zu verwenden, um dies zu unterstützen, benötige jedoch Hilfe beim Einstieg.
Den ganzen Tag habe ich verschiedene Anleitungen und Beispiele gelesen, darunter den Primer , eine Einführung bei IBM und einige Fragen zu SO ( hier und hier ) sowie andere Quellen, die ich aus den Augen verloren habe. Mir ist klar, dass es da draußen viel gibt, aber irgendwie habe ich immer noch Schwierigkeiten.
Ich versuche derzeit, den grundlegendsten Test zu implementieren, um zu bestätigen, dass ich gtest richtig kompiliert / installiert habe und es nicht funktioniert. Die einzige Quelldatei (testgtest.cpp) stammt fast genau aus dieser vorherigen Antwort:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
und meine zugehörige CMakeLists.txt lautet wie folgt:
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
)
Beachten Sie, dass ich mich dafür entschieden habe, eine Verknüpfung mit gtest_main herzustellen, anstatt die Hauptdatei am Ende der CPP-Datei anzugeben, da ich glaube, dass ich dadurch das Testen einfacher auf mehrere Dateien skalieren kann.
Beim Erstellen der generierten SLN-Datei (in Visual C ++ 2010 Express) wird leider eine lange Liste von Fehlern des Formulars angezeigt
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)
was meiner Meinung nach bedeutet, dass ich nicht erfolgreich auf die gtest-Bibliotheken verlinke. Ich habe sichergestellt, dass ich beim Verknüpfen mit den Debug-Bibliotheken versucht habe, im Debug-Modus zu erstellen.
BEARBEITEN
Nachdem ich noch ein bisschen gegraben habe, denke ich, dass mein Problem etwas mit der Art der Bibliothek zu tun hat, in die ich gtest einbaue. Wenn beim Erstellen von gtest mit CMake das BUILD_SHARED_LIBS
Kontrollkästchen deaktiviert ist und ich mein Programm mit diesen .lib-Dateien verknüpfe, werden die oben genannten Fehler angezeigt . Wenn dies BUILD_SHARED_LIBS
jedoch aktiviert ist, erstelle ich eine Reihe von .lib- und .dll-Dateien. Beim Verknüpfen mit diesen .lib-Dateien wird das Programm kompiliert, beim Ausführen wird jedoch beanstandet, dass es gtest.dll nicht finden kann.
Was sind die Unterschiede zwischen einer SHARED
und einer Nicht- SHARED
Bibliothek, und wenn ich nicht freigegeben wähle, warum funktioniert es nicht? Gibt es in der CMakeLists.txt eine Option für mein Projekt, die mir fehlt?
enable_testing()
das
ExternalProject_Add
anstatt verwendenadd_subdirectory
. Siehe diese Antwort für Details.