2012-09-22 1 views
8

Ich versuche, GTest mit CMake so nahtlos wie möglich zu integrieren. Aber der Standard-Build-Typ für meine Testprojekte ist /MDd und GTest standardmäßig auf /MTd. Ich ändere GTest-Projekteigenschaften manuell, um Debug-DLL auszugeben.Wie man GTest build/MDd (anstelle von/MTd) standardmäßig mit CMake?

Aber jedes Mal, wenn ich Änderungen an meinem CMakeLists.txt, GTest Standards zurück auf /MTd. Wie höre ich damit auf?

Antwort

0

Wir lösten das Problem, indem Gtest eigenen Build-System und Kompilieren Gtest als CMake object library aus seiner Einheit zu bauen Quelldatei gtest-all.cc Umgehung: Gtest

# compile Google Test as an object library 
add_library(gtest OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0/src/gtest-all.cc") 
set_property(TARGET gtest PROPERTY INCLUDE_DIRECTORIES 
    "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0" 
    "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0/include") 

Auf diese Weise immer mit den gleichen Optionen kompiliert werden, die wir verwenden für das Projekt. Ein Test ausführbare Datei, die Gtest verwendet, kann dann in der folgenden Art und Weise aufgebaut werden:

add_executable(test_executable ${TESTS_SRC} $<TARGET_OBJECTS:gtest>) 
add_test(NAME test COMMAND test_executable) 
+0

Unter linux hängt Gtest auf der 'pthreads' Bibliothek. Wie verknüpfe ich eine solche Abhängigkeit mit dem "gtest" -Objekt? – Hindol

+0

Erstellt eine [separate Frage] (http://stackoverflow.com/questions/12560054/how-to-set-library-dependenty-on-cmake-library-objects) dafür. – Hindol

+0

Auf diese Weise kompilieren Sie die gesamte Quelle von gtest für jede einzelne ausführbare Testdatei - nicht sehr effizient. Sie verlieren auch alle Überprüfungen und Einstellungen, die in gtests eigener CMakeLists.txt enthalten sind, eine Auswirkung ist die fehlende Abhängigkeit von Pthread unter Linux. – Fraser

13

Sie gtest_force_shared_crt zu ON bevor einschließlich Gtest dies zu erreichen, definieren können. Sie können zu diesem Zweck entweder über die Kommandozeile:

cmake . -Dgtest_force_shared_crt=ON 

oder in Ihrem CMakeLists.txt:

set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 
+1

Sie sollten Ted Middletons Korrektur von unten hinzufügen. Das Hinzufügen der set() -Zeile, wie Sie es vorschlagen, hat keinen Einfluss auf den Gtest-Build. – Ela782

13

Ich denke, eine bessere Option @ Fraser Antwort ist - in diesem Fall Cmake + Gtest 'einfach funktionieren' .

Es ist erwähnenswert, dass, um zu erwähnen, die interne Gtest option Einstellung außer Kraft zu setzen, müssen Sie die Variable in der Cmake Cache setzen:

set(gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll") 
+0

'FORCE' sollte ebenfalls angegeben werden, siehe https://github.com/google/googletest/blob/master/googletest/README.md. –

4

Wenn Ted Middleton Antwort nicht funktioniert, versuchen FORCE zu verwenden:

set(gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" FORCE) 

Es funktionierte für mich

+0

Dies ist die empfohlene Methode gemäß https://github.com/google/googletest/blob/master/googletest/README.md. –