Come configurare googleTest come libreria condivisa su Linux


89

Debian non fornisce più alcun pacchetto precompilato per gTest. Ti suggeriscono di integrare il framework nel makefile del tuo progetto. Ma voglio mantenere pulito il mio makefile. Come imposto gTest come le versioni precedenti (<1.6.0), in modo da poterlo collegare alla libreria?


2
A proposito, le build gtest sono gestite utilizzando gli autotools, quindi il ./configure && make && make installflusso di lavoro standard dovrebbe funzionare bene. Non sono sicuro che questo garantisca un post poiché non sarebbe diverso dalla compilazione di molti altri pacchetti dai sorgenti.
Shawn Chin

7
Immagino che non tutti gli utenti abbiano la stessa esperienza di te. Di recente sono passato da Windows a Linux e sarei stato felice di trovare qualcosa di simile su StackOverflow.
ManuelSchneid3r

2
Nota che Google consiglia di NON creare una libreria, ma di includere invece il codice GTest nel tuo progetto. Vedi code.google.com/p/googletest/wiki/…
Mawg dice reinstate Monica August

Questa è la prima nota nella risposta.
ManuelSchneid3r

1
Il collegamento fornito da @Mawg è rotto (il wiki è stato rimosso), sembra funzionare ma punta a una pagina che non è più in argomento (abbastanza confusa). Le migliori che posso trovare in sostituzione sono queste istruzioni di compilazione: github.com/google/googletest/blob/master/googletest/README.md Tuttavia questo spiega solo come creare con cmake. Per gli autotools, ho trovato la seguente risposta che funziona meglio: stackoverflow.com/a/36000856/1487069
Carlo Wood,

Risposte:


144

Prima di iniziare assicurati di aver letto e compreso questa nota di Google ! Questo tutorial semplifica l'utilizzo di gtest, ma può introdurre fastidiosi bug .

1. Ottieni il framework googletest

wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz

Oppure ottenerlo a mano . Non manterrò questo piccolo How-to, quindi se ti sei imbattuto in esso ei link sono obsoleti, sentiti libero di modificarlo.

2. Disimballare e creare Google Test

tar xf release-1.8.0.tar.gz
cd googletest-release-1.8.0
cmake -DBUILD_SHARED_LIBS=ON .
make

3. "Installa" gli header e le librerie sul tuo sistema.

Questo passaggio potrebbe differire da distro a distro, quindi assicurati di copiare le intestazioni e le librerie nella directory corretta. Ho ottenuto ciò controllando dove si trovavano le precedenti librerie gtest di Debian . Ma sono sicuro che ci sono modi migliori per farlo. Nota: make installè pericoloso e non è supportato

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/gtest/libgtest_main.so googlemock/gtest/libgtest.so /usr/lib/

4. Aggiorna la cache del linker

... e controlla se GNU Linker conosce le librerie

sudo ldconfig -v | grep gtest

Se l'output è simile a questo:

libgtest.so.0 -> libgtest.so.0.0.0
libgtest_main.so.0 -> libgtest_main.so.0.0.0

allora va tutto bene.

gTestframework è ora pronto per l'uso. Basta non dimenticare di collegare il tuo progetto alla libreria impostando -lgtestcome flag del linker e opzionalmente, se non hai scritto il tuo mainroutine di test, il -lgtest_mainflag esplicito .

Da qui in poi potresti voler andare alla documentazione di Google e ai vecchi documenti sul framework per scoprire come funziona. Buona programmazione!

Modifica: funziona anche per OS X! Vedi "Come configurare correttamente googleTest su OS X"


2
Non esiste un make installobiettivo che puoi utilizzare invece di copiare manualmente la libreria e le intestazioni?
Shawn Chin

14
'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
Cito

I file sono stati rinominati nella versione 1.8.0? Non c'è niente include/gtestper quanto posso dire.
Nubcake

2
Il tuo post non è aggiornato. Per favore non indurre in errore le persone, sudo cp -a libgtest_main.so libgtest.so /usr/lib/non funziona più. Il file non è nemmeno lì per cominciare.
Schütze

Vorrei anche sapere perché Debian ha rimosso una libreria condivisa preinstallata (lo hanno fatto secondo le raccomandazioni degli upstream: bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587 ). Tuttavia, il collegamento wiki fornito lì non esiste più. Allora perché è stato così?
Carlo Wood

33

Lasciatemi rispondere a questo specificamente per gli utenti di Ubuntu. Innanzitutto inizia installando il pacchetto di sviluppo gtest.

sudo apt-get install libgtest-dev

Notare che questo pacchetto installa solo file di origine. Devi compilare il codice da solo per creare i file di libreria necessari. Questi file sorgente dovrebbero trovarsi in / usr / src / gtest. Sfoglia questa cartella e usa cmake per compilare la libreria:

sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo make install

Ora per compilare i tuoi programmi che usano gtest, devi collegarlo con:

-lgtest -lgtest_main -lpthread

Questo ha funzionato perfettamente per me su Ubuntu 14.04LTS.


1
In realtà non è necessario copiare le librerie manualmente, c'è un obiettivo per questo in Makefile. Puoi farlo in questo modo: sudo apt-get install cmake # install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install Dovrebbe essere compilato e copiato / usr / local / lib /
Alexander Zinovyev

1
@AlexanderZinovyev Ottengo "make: *** Nessuna regola per far 'installare' il target. Stop." quando
eseguo

2
"sudo make install" funzionava su Ubuntu 18.04, ma non su Ubuntu 16.04.
Ahmed Nassar

1
@AhmedNassar: "sudo make install" fa esattamente la stessa cosa di "sudo cp * .a / usr / lib". Quindi, se l'opzione di installazione non è disponibile nel Makefile generato, è sufficiente copiarli manualmente
amritkrs

Non è necessario farlo manualmente sudo cp *.a /usr/lib, sudo make installdovrebbe essere sufficiente sostituirlo .
lingjiankong

26

Mi ci è voluto un po 'per capirlo perché il normale "make install" è stato rimosso e non uso cmake. Ecco la mia esperienza da condividere. Al lavoro, non ho accesso di root su Linux, così ho installato il framework di test di Google sotto la mia home directory: ~/usr/gtest/.

Per installare il pacchetto in ~ / usr / gtest / come librerie condivise, insieme alla build di esempio:

$ mkdir ~/temp
$ cd ~/temp
$ unzip gtest-1.7.0.zip 
$ cd gtest-1.7.0
$ mkdir mybuild
$ cd mybuild
$ cmake -DBUILD_SHARED_LIBS=ON -Dgtest_build_samples=ON -G"Unix Makefiles" ..
$ make
$ cp -r ../include/gtest ~/usr/gtest/include/
$ cp lib*.so ~/usr/gtest/lib

Per convalidare l'installazione, utilizzare il seguente test.c come semplice esempio di test:

    #include <gtest/gtest.h>
    TEST(MathTest, TwoPlusTwoEqualsFour) {
        EXPECT_EQ(2 + 2, 4);
    }

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

Compilare:

    $ export GTEST_HOME=~/usr/gtest
    $ export LD_LIBRARY_PATH=$GTEST_HOME/lib:$LD_LIBRARY_PATH
    $ g++ -I $GTEST_HOME/include -L $GTEST_HOME/lib -lgtest -lgtest_main -lpthread test.cpp 

1
Con l'ultima riga ottengo l'errore: / usr / bin / ld: /tmp/cczG727X.o: riferimento undefined al simbolo '_ZN7testing4TestC2Ev'. Ho risolto questo problema mettendo test.cpp prima delle librerie. cioè: g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932

Se ci si collega a gtest_main ( lgtest_main), non è necessario definirne uno proprio mainnel file di test.
Gino Mempin

10

Se ti capita di utilizzare CMake, puoi utilizzarlo ExternalProject_Addcome descritto qui .

Questo evita di dover mantenere il codice sorgente di gtest nel tuo repository o installarlo ovunque. Viene scaricato e integrato automaticamente nel tuo albero di build.


3

Aggiornamento per Debian / Ubuntu

Google Mock (pacchetto:) google-mocke Google Test (pacchetto:) libgtest-devsono stati uniti. Si chiama il nuovo pacchetto googletest. Entrambi i vecchi nomi sono ancora disponibili per la retrocompatibilità e ora dipendono dal nuovo pacchetto googletest.

Quindi, per ottenere le tue librerie dal repository dei pacchetti, puoi fare quanto segue:

sudo apt-get install googletest -y
cd /usr/src/googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp googlemock/*.a googlemock/gtest/*.a /usr/lib

Dopodiché, puoi collegarti contro -lgmock(o contro -lgmock_mainse non utilizzi un metodo principale personalizzato) e -lpthread. Questo è stato sufficiente per utilizzare Google Test almeno nei miei casi.

Se desideri la versione più recente di Google Test, scaricala da GitHub. Successivamente, i passaggi sono simili:

git clone https://github.com/google/googletest
cd googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp lib/*.a /usr/lib

Come puoi vedere, il percorso in cui vengono create le librerie è cambiato. Tieni presente che il nuovo percorso potrebbe essere presto valido anche per i repository dei pacchetti.

Invece di copiare le librerie manualmente, potresti usare sudo make install. "Attualmente" funziona, ma tieni presente che non ha sempre funzionato in passato. Inoltre, non hai il controllo sulla posizione di destinazione quando usi questo comando e potresti non voler inquinare /usr/lib.


1

Allo stesso modo sono rimasto deluso da questa situazione e ho finito per creare i miei pacchetti sorgente di Ubuntu per questo. Questi pacchetti sorgente consentono di produrre facilmente un pacchetto binario. Si basano sull'ultima fonte gtest e gmock di questo post.

Pacchetto sorgente DEB di Google Test

Pacchetto sorgente Google Mock DEB

Per costruire il pacchetto binario fai questo:

tar -xzvf gtest-1.7.0.tar.gz
cd gtest-1.7.0
dpkg-source -x gtest_1.7.0-1.dsc
cd gtest-1.7.0
dpkg-buildpackage

Potrebbe dirti che hai bisogno di alcuni pacchetti prerequisiti, nel qual caso devi solo installare apt-get. A parte questo, i pacchetti binari compilati .deb dovrebbero quindi trovarsi nella directory principale.

Per GMock, il processo è lo stesso.

Come nota a margine, sebbene non sia specifico per i miei pacchetti sorgente, quando colleghi gtest al tuo unit test, assicurati che gtest sia incluso per primo ( https://bbs.archlinux.org/viewtopic.php?id=156639 ) Sembra un gotcha comune.


Il tuo pacchetto mi dà errori quando provo a compilare. Qualche motivo per cui ?? ecco il mio log test.cpp :(. text + 0x57): riferimento undefined a testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to testing :: internal :: AssertHelper :: AssertHelper (testing :: TestPartResult :: Type, char const *, int, char const *) 'test. cpp :(. text + 0x97): riferimento undefined a `testing :: internal :: AssertHelper :: operator = (testing :: Message const &) const '... è così lungo che non posso pubblicare l'intera cosa. L'ho fatto in una nuovissima VM Ubuntu 14.04, quindi non è stato installato nient'altro tranne le dipendenze necessarie.
ddelnano

@ddelnano Sì, mi sono imbattuto anche in questo piccolo gioiello di Google Test. Apparentemente l'ordine delle librerie condivise è importante. Quando colleghi gtest al tuo unit test, prova a includere gtest prima di altre librerie. Quando ho riscontrato
Nick Weedon

@ddelnano, anche se la tua suite di test non ha un "main" definito, non dimenticare di collegarti a "gtest_main".
Nick Weedon

Non ho incluso altre librerie. questo è tutto quello che avevo nel mio file #include <gtest/gtest.h> TEST(MathTest, TwoPlusTwoEqualsFour) { EXPECT_EQ(2 + 2, 4); } int main(int argc, char **argv) { ::testing::InitGoogleTest( &argc, argv ); return RUN_ALL_TESTS(); }
ddelnano

non importa, non ho letto il post sul blog fino a dopo aver pubblicato quel commento. Finalmente funziona!
ddelnano

1

Nel caso in cui qualcun altro si trovi nella stessa situazione come me ieri (22/06/2016) e anche lui non abbia successo con gli approcci già pubblicati, Lubuntu 14.04ha funzionato per me usando la seguente catena di comandi:

git clone https://github.com/google/googletest
cd googletest
cmake -DBUILD_SHARED_LIBS=ON .
make
cd googlemock
sudo cp ./libgmock_main.so ./gtest/libgtest.so gtest/libgtest_main.so ./libgmock.so /usr/lib/
sudo ldconfig

1

Questa risposta di askubuntu è ciò che ha funzionato per me. Sembra più semplice di altre opzioni e meno soggetto a errori, poiché utilizza il pacchetto libgtest-devper ottenere i sorgenti e le build da lì: /ubuntu/145887/why-no-library-files-installed-for-google- test? answertab = votes # tab-top

Si prega di fare riferimento a quella risposta, ma solo come scorciatoia fornisco anche i passaggi qui:

sudo apt-get install -y libgtest-dev
sudo apt-get install -y cmake
cd /usr/src/gtest
sudo cmake .
sudo make
sudo mv libg* /usr/lib/

Dopodiché, potrei costruire il mio progetto da cui dipende gtestsenza problemi.


1

Il seguente metodo evita di manipolare manualmente la /usr/libdirectory e richiede anche modifiche minime nel CMakeLists.txtfile. Consente inoltre al tuo gestore di pacchetti di disinstallare in modo pulitolibgtest-dev .

L'idea è che quando ricevi il libgtest-devpacchetto tramite

sudo apt install libgtest-dev

La sorgente è archiviata nella posizione /usr/src/googletest

Puoi semplicemente puntare il tuo CMakeLists.txta quella directory in modo che possa trovare le dipendenze necessarie

Sostituisci semplicemente FindGTestconadd_subdirectory(/usr/src/googletest gtest)

Alla fine, dovrebbe assomigliare a questo

add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)

0

Questo installerà la libreria di test e simulazione di Google nel sistema basato su Ubuntu / Debian:

sudo apt-get install google-mock

Testato in Google Cloud nell'immagine basata su Debian.


Hmm, no, penso che si installa solo googlemock, ma non si installa googletest(gtest). Almeno questo è quello che è successo a me.
jotadepicas

0

Questo creerà e installerà sia gtest che gmock 1.7.0:

mkdir /tmp/googleTestMock
tar -xvf googletest-release-1.7.0.tar.gz -C /tmp/googleTestMock
tar -xvf googlemock-release-1.7.0.tar.gz -C /tmp/googleTestMock
cd /tmp/googleTestMock
mv googletest-release-1.7.0 gtest
cd googlemock-release-1.7.0
cmake -DBUILD_SHARED_LIBS=ON .
make -j$(nproc)
sudo cp -a include/gmock /usr/include
sudo cp -a libgmock.so libgmock_main.so /usr/lib/
sudo cp -a ../gtest/include/gtest /usr/include
sudo cp -a gtest/libgtest.so gtest/libgtest_main.so /usr/lib/
sudo ldconfig

-1

Per 1.8.1 basato sulla risposta di @ ManuelSchneid3r ho dovuto fare:

wget github.com/google/googletar xf release-1.8.1.tar.gz 
tar xf release-1.8.1.tar.gz
cd googletest-release-1.8.1/
cmake -DBUILD_SHARED_LIBS=ON .
make

Ho quindi fatto make installche sembrava funzionare per 1.8.1, ma seguendo @ ManuelSchneid3r significherebbe:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/

È passato un po 'di tempo che ho scritto questa risposta, fammi sapere qual è il problema se pensi che non abbia valore / non sia valido.
ntg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.