2012-09-22 5 views
8

Próbuję zintegrować GTest z CMake tak płynnie jak to możliwe. Ale domyślny typ kompilacji dla moich projektów testowych to /MDd, a domyślny zestaw GTest to /MTd. Ręcznie zmieniam właściwości projektu GTest, aby emitować DLL debugowania.Jak zrobić domyślnie kompilację GTest/MDd (zamiast/MTd), używając CMake?

Ale za każdym razem, gdy wprowadzam zmiany w moim CMakeLists.txt, domyślnie GTest powraca do /MTd. Jak mogę to zatrzymać?

Odpowiedz

0

Rozwiązaliśmy ten problem, z pominięciem własnego systemu gromadzenia numeru GTEST i kompilowania numeru GTEST jako CMake object library od jego jedności pliku źródłowego build gtest-all.cc:

# 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") 

ten sposób numeru GTEST zawsze będą zestawiane z tymi samymi opcjami, które używamy do projekt. wykonywalny test, który wykorzystuje numeru GTEST może być zbudowany w sposób następujący:

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

na Linuksie, numeru GTEST zależy od 'pthreads' bibliotece. Jak powiązać taką zależność z obiektem 'gtest'? – Hindol

+0

Utworzono dla tego [osobne pytanie] (http://stackoverflow.com/questions/12560054/how-to-set-library-dependencies-on-cmake-library-objects). – Hindol

+0

W ten sposób przekompilujesz całe źródło gtest dla każdego osobnego pliku wykonywalnego testu - niezbyt wydajne. Utracisz także wszystkie kontrole i ustawienia zawarte w CMakeLists.txt, której jednym z przykładów jest brak zależności od pthread na Linuksie. – Fraser

13

Można zdefiniować gtest_force_shared_crt do ON przed tym numeru GTEST do osiągnięcia tego celu. Można też to zrobić za pomocą linii komend:

cmake . -Dgtest_force_shared_crt=ON 

lub w CMakeLists.txt:

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

Powinieneś dodać korektę Teda Middletona od dołu. Dodanie linii set(), jak sugerujesz, nie ma wpływu na kompilację gtest. – Ela782

13

Myślę, że lepszym rozwiązaniem jest @ odpowiedź Frasera - w tym przypadku, cmake + numeru GTEST „tylko praca” .

Warto wspomnieć, że w celu Unieważnia wewnętrzny ustawienie numeru GTEST option, musisz umieścić zmienną w pamięci podręcznej cmake:

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

Należy również podać 'FORCE', patrz https://github.com/google/googletest/blob/master/googletest/README.md. –

4

Jeśli odpowiedź Teda Middleton nie działa, spróbuj użyć siły:

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

on pracował dla mnie

+0

Jest to zalecany sposób, zgodnie z https://github.com/google/googletest/blob/master/googletest/README.md. –