risposta

40

Ciò che Arlaharen ha detto era fondamentalmente corretto, tranne che ha omesso la parte che spiega gli errori del linker. Prima di tutto, è necessario creare l'applicazione senza il CRT come libreria di runtime. Dovresti sempre farlo comunque, in quanto semplifica davvero la distribuzione della tua applicazione. Se non lo fai, allora tutti i tuoi utenti hanno bisogno della libreria di runtime di Visual C++ installata, e quelli che non si lamenteranno delle misteriose DLL mancanti sul loro sistema ... per le poche centinaia di kilobyte che costa collegare in il CRT staticamente, ti risparmi un sacco di mal di testa più tardi in supporto (credimi su questo - l'ho imparato nel modo più duro!).

In ogni caso, per fare questo, si passa alle proprietà della destinazione -> C/C++ -> Generazione codice -> Libreria di runtime, e deve essere impostato come "Multi-Threaded" per la versione di Release e "Multi- Debug filettato "per la build di Debug.

Dal momento che la libreria GTEST è costruito nello stesso modo, è necessario assicurarsi che si sta collegando contro la versione corretta di esso, altrimenti il ​​linker tirerà in un'altra copia della libreria di runtime, che è l'errore hai visto (btw, questo non dovrebbe fare la differenza se stai usando MFC o no). È necessario creare gtest come in modalità debug e Release e conservare entrambe le copie. Quindi si collega a gtest.lib/gtest_main.lib nella versione di rilascio e gtestd.lib/gtest_maind.lib nel build di debug.

Inoltre, è necessario assicurarsi che l'applicazione punti alla directory in cui sono memorizzati i file di intestazione gtest (in proprietà -> C/C++ -> Generale -> Directory di inclusione aggiuntive), ma se si è arrivati ​​al linker errore, presumo che tu sia già riuscito a ottenere questa parte corretta, altrimenti avresti avuto molti più errori del compilatore da affrontare prima.

+0

Ho imparato questa "strada difficile", passando tutta la mia giornata. Finalmente l'ho fatto funzionare, dopo averli costruiti entrambi nello stesso modo. Grazie per la risposta, ma è tardi. :/ E BTW, il tuo suggerimento CRT è sbagliato, ma non ho abbastanza spazio per discuterne. Vedi http://tinyurl.com/dj5k7k – knaser

+0

beh se lo hai imparato nel modo "difficile" potresti essere dimenticato che le DLL di runtime CRT sono chiamate "ridistribuibili" ... quindi è chiaro che devi ridistribuirle tu stesso .. o includendo l'installatore di redist nel proprio programma di installazione, o semplicemente estraendo le DLL necessarie nella propria cartella di installazione ... (incluso un file manifest se necessario) – smerlin

+1

Collegamento statico del CRT significa che l'applicazione non acquisirà exploit/correzioni di sicurezza – paulm

4

aver costruito GTEST, questo è quello che ho fatto:

  1. Add \ mypath \ GTEST-1.0.1 \ Debug (o di uscita) al Common Properties-> Linker-> Generale-> Ulteriori directory di libreria
  2. Aggiungi gtest.lib e gtest_main.lib al Common Properties-> Linker-> INPUT-> dipendenze aggiuntive

Dopo di che ho appena scrivere il mio test con il test o TEST_F a seconda dei casi e compilarli insieme con il mio principale funzione:

int main(int argc, char** argv) 
{ 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 
+5

Ottengo molti errori linker: già definito in gtest.lib ... eg .: 1> LIBCMT.lib (tidtable.obj): errore LNK2005: __encode_pointer già definito in msvcrt.lib (MSVCR80 .dll) Oh, btw, sto provando a scrivere test per un codice MFC. – knaser

+0

Siamo spiacenti. Non penso di poterti aiutare lì. Per qualche ragione non ho questi errori di collegamento. Hai provato a costruire un semplice test del mondo con gtest? – Arlaharen

+0

'gtest_main.lib' contiene la funzione' main' di default, quindi probabilmente non vuoi includerla se hai scritto il tuo 'main' esplicitamente. – Groo

2

In Microsoft Visual Studio, il tipo di libreria di runtime non correttamente configurato causa errori di collegamento.

VS 2005 (e 2008) utilizza DLL con multithreading o DLL di debug multithreading come impostazione predefinita. Ma la libreria di Google Test utilizza il runtime di debug con Mulithreaded o Mulithreaded come predefinito.

Quindi, scegliere il tipo di libreria di runtime appropriato per la libreria di test google. (in Proprietà di configurazione -> Generazione codice -> Libreria runtime).

+0

cos'è il runtime appropriato? (MD o altro) –

94

(Queste istruzioni ottenere il framework di test che lavora per la configurazione di debug.Dovrebbe essere abbastanza banale per applicare la stessa procedura per la configurazione di rilascio.)

Get Google C++ Testing Framework

  1. scaricare l'ultima gtest framework
  2. Unzip per C:\gtest

Costruisci le librerie Framework

  1. Aprire C:\gtest\msvc\gtest.sln in Visual Studio
  2. set di configurazione a "Debug"
  3. Genera soluzione

creare e configurare il progetto di test

  1. creare una nuova soluzione e scegliere la modello Visual C++> Win32> Applicazione console Win32
  2. Fare clic con il tasto destro del mouse sul progetto appena creato e selezionare Proprietà
  3. Modificare la configurazione in debug.
  4. Proprietà di configurazione> C/C++> Generale> Directory di inclusione aggiuntive: Aggiungi C:\gtest\include
  5. Proprietà di configurazione> C/C++> Generazione codice> Runtime Library: Se i link codice per una DLL runtime, scegliere Multi-threaded Debug DLL (/ MDD). In caso contrario, scegliere Debug multi-thread (/ MTd).
  6. Proprietà di configurazione> Linker> Generale> Ulteriori directory di libreria: Aggiungi C:\gtest\msvc\gtest\Debug o C:\gtest\msvc\gtest-md\Debug, a seconda della posizione di gtestd.lib
  7. proprietà di configurazione> Linker> Input> Dipendenze aggiuntive: Aggiungi gtestd.lib

Verifica Tutto funziona

  1. Aprire il cpp nel progetto di test che contiene la funzione main().
  2. incollare il seguente codice:

    #include "stdafx.h" 
    #include <iostream> 
    
    #include "gtest/gtest.h" 
    
    TEST(sample_test_case, sample_test) 
    { 
        EXPECT_EQ(1, 1); 
    } 
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke 
    } 
    
  3. Test> avviare il debug

Se tutto ha funzionato, si dovrebbe vedere apparire la finestra della console e vi mostrerà i risultati del test unità.

+9

questa è stata un'ottima guida! Sono stato in grado di far girare la palla, ma vorrei aggiungere ancora una nota: il progetto di test e la libreria gtest devono essere costruiti con la stessa opzione Code Generation, o entrambi sono/MDd o entrambi sono/MTd, altrimenti ci sarà essere un mucchio di errori di collegamento. – Kiril

+1

** Nota: ** Chiunque stia tentando di eseguire questa implementazione simile con Microsoft Visual Studio .Net 2003, le librerie di Google Test Framework impostano automaticamente la libreria di runtime su "_Single-threaded Debug_" per la modalità di debug e "_Single-threaded_" per la modalità di rilascio e per quanto ho provato, l'opzione per cambiarla dalla generazione del codice non è disponibile. Quindi, assicurati di scegliere l'opzione Single-threaded come libreria di runtime nel tuo progetto. Oltre a questo, questo tutorial semplice e breve funziona perfettamente! – Neophile

+0

Funziona anche alla grande in VS2008. – louisgab

5

Se non si desidera scrivere il proprio main() per i test, è possibile utilizzare la funzione main() definita in gtest_main.lib, ma in tal caso si ottengono errori del linker "Punto di ingresso deve essere definito" in VS2012. Nel progetto di test impostare ProjectProperties-> Linker-> System-> SubSystem su "Console" poiché questo forzerà VS2012 a cercare un punto di ingresso chiamato "main()" e lo troverà in gtest_main.lib (a condizione che tu abbia collegato correttamente).

0

Molti errori, ci sono voluti un po 'per risolvere.

Qui sono semplici passi:

# Scarica Googletest file ZIP da: https://github.com/google/googletest

# Googletest Visual Studio soluzione

Open C:\googletest\googletest\msvc\2010\gtest.sln 
    Change "Solution configuration" 
     from "Debug" to "Release" 
    Build Solution 
     creates gtest.lib 

# Il vostro progetto:

Project Properties > Configuration Properties > VC++ Directories > Include Directories 
    append the following:  ;C:\googletest\googletest\include 

Project Properties > Configuration Properties > Linker > General > Additional Library Directories > 
    append the following:   ;C:\googletest\googletest\msvc\2010\gtest\Win32-Release 

Project Properties > Configuration Properties > C/C++ > Runtime Library 
    Remove the value of the above. (or match it to Googletest project)