2012-09-22 1 views
8

Sto cercando di integrare GTest con CMake nel modo più semplice possibile. Ma il tipo di build predefinito per i miei progetti di test è /MDd e GTest predefinito a /MTd. Sto modificando manualmente le proprietà del progetto GTest per emettere la DLL di debug.Come rendere GTest build/MDd (invece di/MTd) per impostazione predefinita, utilizzando CMake?

Ma ogni volta che apporto modifiche al mio CMakeLists.txt, le impostazioni predefinite GTest tornano a /MTd. Come lo fermo?

risposta

0

abbiamo risolto il problema bypassando proprio sistema di generazione di GTEST e compilazione GTEST come CMake object library dal file di origine costruire l'unità 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") 

In questo modo GTEST sarà sempre compilato con le stesse opzioni che usiamo per il progetto. Un eseguibile test che utilizza GTEST può quindi essere costruito nel seguente modo:

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

su Linux, GTEST dipende la libreria 'pthreads'. Come associo tale dipendenza all'oggetto 'gtest'? – Hindol

+0

Creata una [domanda separata] (http://stackoverflow.com/questions/12560054/how-to-set-library-dependencies-on-cmake-library-objects) per questo. – Hindol

+0

In questo modo, si ricompila l'intera fonte di gtest per ogni eseguibile di test separato, non molto efficiente. Inoltre, perdi tutti i controlli e le impostazioni contenuti nel file CMakeList.txt di gtest, una ripercussione che è la dipendenza mancante da pthread su Linux. – Fraser

13

È possibile definire gtest_force_shared_crt a ON prima di includere GTEST per raggiungere questo obiettivo. È possibile farlo tramite la riga di comando:

cmake . -Dgtest_force_shared_crt=ON 

o nel vostro CMakeLists.txt:

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

Dovresti aggiungere la correzione di Ted Middleton dal basso. L'aggiunta della linea set(), come suggerito, non ha alcuna influenza sulla build gtest. – Ela782

13

penso che una scelta migliore è @ risposta di Fraser - in quel caso, cmake + GTEST 'solo di lavoro' .

Vale la pena ricordare che, al fine di sostituire l'impostazione interna GTEST option, è necessario mettere la variabile nella cache cmake:

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

Anche 'FORCE' deve essere specificato, consultare https://github.com/google/googletest/blob/master/googletest/README.md. –

4

Se la risposta di Ted Middleton non funziona, provare a usare la forza:

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

ha funzionato per me

+0

Questo è il metodo consigliato, in base a https://github.com/google/googletest/blob/master/googletest/README.md. –